使用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相等时返回值是相同的.
分享到:
相关推荐
3. **自定义排序规则**:如果需要自定义排序规则(例如降序或根据特定属性排序),可以传递一个自定义的比较函数或函数对象作为第三个参数。例如,如果`vector`存储的是自定义类的对象,可以根据对象的某个成员变量...
- **排序算法**:如`std::sort`用于对容器内的元素进行排序,可以自定义比较函数。 - **查找算法**:如`std::find`,`std::binary_search`,`std::lower_bound`等,用于在容器内查找特定元素或范围。 - **迭代器...
然而,在1987年时,C++中尚未引入模板机制,因此这项工作被推迟。到了1988年,Stepanov加入HP实验室,并于1992年被任命为一个算法项目的负责人。在这个项目中,他与Meng Lee共同开发了一个庞大的库——标准模板库...
12. **标准库的使用**:书中会介绍如何有效利用C++标准库中的各种功能,如iostream库进行输入输出,algorithm库中的排序算法等。 13. **预处理器宏的谨慎使用**:虽然宏在某些场景下很有用,但过度使用可能导致代码...
- **非标准容器**:尽管不包含在STL中,但可以使用模板和迭代器来实现自定义容器。 #### Part 3: Special Topics ##### 8. Run-Time Type Identification (RTTI) 运行时类型识别是C++中的一个重要特性,允许在...
- **断言**:C++中的`assert`宏可以用于在开发阶段检查程序的内部状态,确保代码按预期运行。 5. **其他数据结构**: - **双链表**:单链表的扩展,每个节点有两个指针,一个指向前一个节点,一个指向后一个节点...
7.11 有关对象的思考:在电梯模拟程序中使用复合和动态对象管理 小结 术语 自测练习 自测练习答案 练习 第8章 运算符重载 8.1 简介 8.2 运算符重载的基础 8.3 运算符重载的限制 8.4 用作类成员与友元函数的...
7.11 有关对象的思考:在电梯模拟程序中使用复合和动态对象管理 小结 术语 自测练习 自测练习答案 练习 第8章 运算符重载 8.1 简介 8.2 运算符重载的基础 8.3 运算符重载的限制 8.4 用作类成员与友元函数的...
全书围绕c++语言的结构来组织,开始章节介绍编程的普通概念,接下来详细介绍C++hh的继承、多态、异常处理以及标准模板库(STL),同时还包含模式和uML的介绍。本书内容系统、全面,给出了大量代码示例、自测练习、编程...
使用STL(标准模板库)的容器、算法和迭代器等组件时,测试应覆盖其各种操作,确保正确性和效率。例如,测试排序算法的时间复杂度,或检查容器容量变化时的行为。 通过这些测试方法和实践,开发者可以确保C++项目...
在C++中,可以利用STL(Standard Template Library)中的算法,如sort和binary_search,或者自定义算法来实现特定需求。 其次,数据结构的选择直接影响到算法的效率。常见的数据结构包括数组、链表、栈、队列、树...
4. `<deque>`、`<list>`、`<map>`、`<set>`、`<queue>`、`<stack>` 和 `<vector>`:这些是STL(Standard Template Library)容器,分别表示双端队列、线性列表、映射、集合、队列、堆栈和动态数组。 5. `...
C++还有丰富的标准库,比如STL(Standard Template Library),它提供了容器(如vector、list、set等)、迭代器、算法和函数对象等功能,极大地增强了代码的可复用性和效率。例如,`std::vector<int>`可以创建一个...