首页 > 其他分享 >std::sort 错误"Expression : invalid operator <"

std::sort 错误"Expression : invalid operator <"

时间:2024-03-26 20:45:55浏览次数:29  
标签:std sort testOperator int value invalid value2

解决:std::sort的比较函数,切记仅使用小于或大于,不要使用小于等于或大于等于。即所谓的“ strict weak ordering”,也就是说,如果a==b,则返回的应该是false,如果返回的是true,则会出上面的错

这个问题是标准库sort实现导致的

参考https://blog.csdn.net/qq_35097289/article/details/104648601

 

class testOperator
{
public:
    

    int value=0;
    int value2=0;
    void setV(int v)
    {
        value = v;
    }
    void setV2(int v2)
    {
        value2 = v2;
    }

    bool operator <=(const testOperator& other) const
    {
        if (other < *this)
        {
            return false;
        }
        return true;
    }

    bool operator <(const testOperator& other) const
    {
        if (this->value == other.value)
        {
            return this->value2 < other.value2;
        }
        return this->value < other.value;
    }
};

bool compareTestOperator(const testOperator& t1, const testOperator& t2)
{
    return t1 <= t2;  //不能使用<=,如果容器元素中有相等的,就会导致crash
}

int main() {

    {
        testOperator t1;
        testOperator t2;
        t2.setV(10);//当前没问题,注释掉这一句就会crash

        std::vector < testOperator > vec = {t1, t2};
        std::sort(vec.begin(), vec.end(),compareTestOperator);
        std::cout << vec.size() << std::endl;
    }

 

标签:std,sort,testOperator,int,value,invalid,value2
From: https://www.cnblogs.com/Cxiangyang/p/18097520

相关文章

  • Android证书校验出现java.io.IOException: Invalid keystore format错误的解决方案
    使用下面命令keytool-list-v-keystore签名.keystore出现错误java.io.IOException:Invalidkeystoreformat一般出现这种错误的情况有2种可能1.密码错误2.JDK版本问题1.如果是JDK8生成的keystore,然后用JDK11(+)执行是没问题的,当前情况不需要解决,因为是成功......
  • std::packaged_task
    std::packaged_task包装一个可调用的对象,并且允许异步获取该可调用对象产生的结果,从包装可调用对象意义上来讲,std::packaged_task与std::function类似,只不过std::packaged_task将其包装的可调用对象的执行结果传递给一个std::future对象(该对象通常在另外一个线程中获取st......
  • C++11标准模板(STL) 算法(std::reverse)
    定义于头文件<algorithm>算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first,last) ,其中 last 指代要查询或修改的最后元素的后一个元素。逆转范围中的元素顺序std::reverse1)反转[first,last)范围中的元素顺序表......
  • C++ std::reverse函数
    函数原型,定义std::reverse定义于头文件 <algorithm>1(1)2template<classBidirIt>3voidreverse(BidirItfirst,BidirItlast);(C++20前)45template<classBidirIt>6constexprvoidreverse(BidirItfirst,BidirItlast);(C++20起)......
  • std::promise
    std::promise的作用就是提供一个不同线程之间的数据同步机制,它可以存储一个某种类型的值,并将其传递给对应的future,即使这个future与promise不在同一个线程中也可以安全的访问到这个值。std::promise<int>promiseObj;可以通过get_future()来获取与该promise对象相关联的......
  • requests.exceptions.MissingSchema: Invalid URLrequests.exceptions.ConnectionErro
    代码如下,运行时出现 requests.exceptions.ConnectionError:HTTPSConnectionPool(host='www.dropbox.com',port=443):Maxretriesexceededwithurl:/s/dm3m1o0tsv9terq/pytorch_model.bin?dl=1(CausedbyNewConnectionError('<urllib3.connection.HTTPSConne......
  • std::atomic 使用
    std::atomic(原子变量)参考文章包括:C++原子变量atomic详解-知乎(zhihu.com)C++中的原子变量(std::atomic)使用指南_std::atomic-CSDN博客cplusplus.com/reference/atomic/atomic/原子变量是C++11中用于多线程编程的便捷工具(同步机制)之一.其提供了一种线程安全的方式来......
  • std::async
    C++11提供了异步接口std::async,通过这个异步接口可以很方便的获取线程函数的执行结果。std::async会自动创建一个线程去调用线程函数,它返回一个std::future,这个future中存储了线程函数返回的结果,当我们需要线程函数的结果时,直接从future中获取,非常方便。但是我想说的是,其实std::as......
  • std::unique_lock
    C++11标准中定义了另外一个与MutexRAII相关类unique_lock,该类与lock_guard类相似,也很方便线程对互斥量上锁,但它提供了更好的上锁和解锁控制。unique_lock对象以独占所有权的方式(uniqueowership)管理mutex对象的上锁和解锁操作,所谓独占所有权,就是没有其他的unique_loc......
  • std::lock_guard 介绍
    std::lock_gurad是C++11中定义的模板类。定义如下:template <class Mutex>class lock_guard;lock_guard对象通常用于管理某个锁(Lock)对象,因此与MutexRAII相关,方便线程对互斥量上锁,即在某个lock_guard对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而lo......