`
wander754085
  • 浏览: 52147 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

STL中容器使用自定义排序时出现assert

阅读更多

         使用STL容器时(此次我遇到的问题是使用STL的优先级队列priority_queue时出现的),如果要放入的内容非基本类型(自定义对象或结构体)时,一般需要使用自定义的排序方法,我的自定义排序是这样写的:    

 

struct cmp
{
	bool operator()(const Edge* e1,const Edge* e2)
	{
		if(e1->weight >= e2->weight)
			return true;
		return false;
	}
};
     这种写法初看没有什么问题,但运行之后便出现了Expression: invalid operator< ,跟进之后发现该断言出现在algorithm的2457行,而最终抛出该assert的代码是这样写的:    

 

 

if (!_Pred(_Left, _Right))
       return (false);
else if (_Pred(_Right, _Left))
       _DEBUG_ERROR2("invalid operator<", _File, _Line);
return (true);

 

     这一段的代码的意思是,如果你交换cmp的两个要比较的元素的位置,得出的结果不能一样,也就是说,如果a比b小,则b肯定不会比a小 如果定义的函数既得出a比b小,又得出b比a小,那这个函数定义得肯定有问题. 所以对于我上面的cmp函数,如果有两个要比较的元素值相等的时候,就会出现这种情况,将>=改为>就行了,交换位置后就会得到不同的返回结果. 同理,很多人喜欢直接写成 return a-b  这样也是不行的; a b相等时返回值是相同的.        

分享到:
评论

相关推荐

    STL使用_Vector排序

    3. **自定义排序规则**:如果需要自定义排序规则(例如降序或根据特定属性排序),可以传递一个自定义的比较函数或函数对象作为第三个参数。例如,如果`vector`存储的是自定义类的对象,可以根据对象的某个成员变量...

    STL 应用例子 包括各容器的使用

    - **排序算法**:如`std::sort`用于对容器内的元素进行排序,可以自定义比较函数。 - **查找算法**:如`std::find`,`std::binary_search`,`std::lower_bound`等,用于在容器内查找特定元素或范围。 - **迭代器...

    标准模板库STL(Standard Template Library)指南

    然而,在1987年时,C++中尚未引入模板机制,因此这项工作被推迟。到了1988年,Stepanov加入HP实验室,并于1992年被任命为一个算法项目的负责人。在这个项目中,他与Meng Lee共同开发了一个庞大的库——标准模板库...

    More Effective C++

    12. **标准库的使用**:书中会介绍如何有效利用C++标准库中的各种功能,如iostream库进行输入输出,algorithm库中的排序算法等。 13. **预处理器宏的谨慎使用**:虽然宏在某些场景下很有用,但过度使用可能导致代码...

    Thinking In C++ VolumeII.pdf

    - **非标准容器**:尽管不包含在STL中,但可以使用模板和迭代器来实现自定义容器。 #### Part 3: Special Topics ##### 8. Run-Time Type Identification (RTTI) 运行时类型识别是C++中的一个重要特性,允许在...

    数据结构算法实现(C++,word版)

    - **断言**:C++中的`assert`宏可以用于在开发阶段检查程序的内部状态,确保代码按预期运行。 5. **其他数据结构**: - **双链表**:单链表的扩展,每个节点有两个指针,一个指向前一个节点,一个指向后一个节点...

    C++大学教程,一本适合初学者的入门教材(part2)

    7.11 有关对象的思考:在电梯模拟程序中使用复合和动态对象管理 小结 术语 自测练习 自测练习答案 练习 第8章 运算符重载 8.1 简介 8.2 运算符重载的基础 8.3 运算符重载的限制 8.4 用作类成员与友元函数的...

    C++大学教程,一本适合初学者的入门教材(part1)

    7.11 有关对象的思考:在电梯模拟程序中使用复合和动态对象管理 小结 术语 自测练习 自测练习答案 练习 第8章 运算符重载 8.1 简介 8.2 运算符重载的基础 8.3 运算符重载的限制 8.4 用作类成员与友元函数的...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    全书围绕c++语言的结构来组织,开始章节介绍编程的普通概念,接下来详细介绍C++hh的继承、多态、异常处理以及标准模板库(STL),同时还包含模式和uML的介绍。本书内容系统、全面,给出了大量代码示例、自测练习、编程...

    测试

    使用STL(标准模板库)的容器、算法和迭代器等组件时,测试应覆盖其各种操作,确保正确性和效率。例如,测试排序算法的时间复杂度,或检查容器容量变化时的行为。 通过这些测试方法和实践,开发者可以确保C++项目...

    Competitive-Programming:跨平台解决与算法,数据结构和数学有关的各种问题

    在C++中,可以利用STL(Standard Template Library)中的算法,如sort和binary_search,或者自定义算法来实现特定需求。 其次,数据结构的选择直接影响到算法的效率。常见的数据结构包括数组、链表、栈、队列、树...

    c++和c的头文件大全

    4. `&lt;deque&gt;`、`&lt;list&gt;`、`&lt;map&gt;`、`&lt;set&gt;`、`&lt;queue&gt;`、`&lt;stack&gt;` 和 `&lt;vector&gt;`:这些是STL(Standard Template Library)容器,分别表示双端队列、线性列表、映射、集合、队列、堆栈和动态数组。 5. `...

    cpp代码-222222222222222222222222222222

    C++还有丰富的标准库,比如STL(Standard Template Library),它提供了容器(如vector、list、set等)、迭代器、算法和函数对象等功能,极大地增强了代码的可复用性和效率。例如,`std::vector&lt;int&gt;`可以创建一个...

Global site tag (gtag.js) - Google Analytics