STL使用sort注意的问题

结构体使用sort算法时,重载operator<(..)。如果我们按下面这样写


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

#include <iostream>

#include <vector>

#include <stdint.h>

#include <algorithm>

#include <string.h>

using namespace std;

typedef struct SidInterface {

    SidInterface() {

        memset(this, 0, sizeof(SidInterface));

    }

    SidInterface(uint64_t s, uint32_t i) {

        sid = s;

        interface = i;

    }

    uint64_t sid;

    uint32_t interface;

    bool operator<(const SidInterface& tmp) const {

        if (sid > tmp.sid) {

            return false;

        } else if (sid <= tmp.sid) {

            return true;

        } else {

            return interface < tmp.interface;

        }

    }

    bool operator==(const SidInterface& tmp) const {

        return (sid == tmp.sid && interface == tmp.interface);

    }

} SidInterface_T;

int main()

{

    vector<SidInterface_T> vec {

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

            SidInterface(4504699140857627, 4001),

            SidInterface(4511296210624283, 4001),

    };

    sort(vec.begin(), vec.end());

    auto uni = unique(vec.begin(), vec.end());

    vec.erase(uni, vec.end());

}

我们在运行的时候,就会产生一个core dump;仔细去看也没有发现哪里不对,是不是很郁闷?
其实问题就在这里:

else if (sid <= tmp.sid) {

这种写法是错误的,应该是

else if (sid < tmp.sid) {

请参见:www.sgi.com/tech/stl/StrictWeakOrdering.html

时间: 2024-08-25 07:46:44

STL使用sort注意的问题的相关文章

STL算法 — sort

能使用STL的sort系列算法的前提是容器的迭代器必须为随机迭代器.所以,vector和deque天然适用.STL的sort算法采用了一些策略,在不同情况下采用不同的排序算法,以达到各种算法优势互补的效果.基本的原则是:数据量大时采用快速排序,数据量小时采用插入排序(这是对快排常用的一种优化策略),递归层次过深改用堆排序. 首先是插入排序.它的平均和最坏时间复杂度都为O(N2),量级小于千,那么插入排序还是一个不错的选择.SGI STL的插入排序默认以增序排列,另外还可以传入一个仿函数作为比较规

STL源代码分析——STL算法sort排序算法

前言 因为在前文的<STL算法剖析>中,源代码剖析许多,不方便学习,也不方便以后复习.这里把这些算法进行归类,对他们单独的源代码剖析进行解说.本文介绍的STL算法中的sort排序算法,SGI STL中的排序算法不是简单的高速排序,而是交叉利用各种排序:堆排序.插入排序和高速排序:这样做的目的是提高效率.针对数据量比較大的採用高速排序,数据量比較小的能够採用堆排序或插入排序. 本文介绍了有关排序的算法random_shuffle.partition.stable_partition.sort.s

STL List::sort() 解析

看侯捷翻译那本<STL源码剖析>中list内置sort的算法,书中注释说是quick sort,看了半天没看明白, template <class T, class Alloc> template <class T, class Alloc> void list<T, Alloc>::sort() if (node->next == node || link_type(node->next)->next == node) return; l

详细解说 STL 排序(Sort)(转)

作者Winter 详细解说 STL 排序(Sort) 0 前言: STL,为什么你必须掌握 1 STL提供的Sort 算法 1.1 所有sort算法介绍 1.2 sort 中的比较函数 1.3 sort 的稳定性 1.4 全排序 1.5 局部排序 1.6 nth_element 指定元素排序 1.7 partition 和stable_partition 2 Sort 和容器 3 选择合适的排序函数 4 小结 5 参考文档 一切复杂的排序操作,都可以通过STL方便实现 ! 0 前言: STL,为

详细解说 STL 排序(Sort)

http://www.cppblog.com/mzty/archive/2005/12/15/1770.html 详细解说 STL 排序(Sort) 0 前言: STL,为什么你必须掌握 1 STL提供的Sort 算法 1.1 所有sort算法介绍 1.2 sort 中的比较函数 1.3 sort 的稳定性 1.4 全排序 1.5 局部排序 1.6 nth_element 指定元素排序 1.7 partition 和stable_partition 2 Sort 和容器 3 选择合适的排序函数

C++ STL的sort 函数 以及自定义的比较函数

没什么特别擅长的内容,先做个小笔记好了.在编程时,使用C++的标准模板库(STL)能节约工作量,增加代码的可读性,能灵活运用无疑会提高编程的效率,俗话说:Write less, create more ~ 然后这篇笔记就简单讨论一下sort函数吧.对于vector,我们使用algorithm头文件中的sort函数来排序元素,如果元素类型是实数.字符串之类的,直接使用sort 函数就可以方便的排序了.使用方法就是: #include <vector> #include <algorithm

使用STL库sort函数对vector进行排序

使用STL库sort函数对vector进行排序,vector的内容为对象的指针,而不是对象. 代码如下 1 #include <stdio.h> 2 #include <vector> 3 #include <algorithm> 4 5 using namespace std; 6 7 class Elm 8 { 9 public: 10 int m_iSortProof; 11 12 private: 13 int __m_iValue; 14 static int

STL之sort函数的使用方法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! STL封装了一个排序算法,该算法对应的头文件为#include<algorithm>,我们可以根据需要对一个数组进行排序或者降序. sort的函数原型为: void sort(b,e,pre=up),表示对[b,e)的元素进行排序,第三个参数为一个谓词,我们可以自定义排序方式,默认排序方式为升序排序. 具体实现代码如下: #include<iostream> #include<vector> #include<i

STL vector+sort排序和multiset/multimap排序比较

本文由 www.169it.com 搜集整理 在C++的STL库中,要实现排序可以通过将所有元素保存到vector中,然后通过sort算法来排序,也可以通过multimap实现在插入元素的时候进行排序.在通过vector+sort进行排序时,所有元素需要先存入vector容器中,sort在排序时又需要将元素全部取出来再进行排序.multimap底层实现为红黑树,因此元素在插入的过程中就实现了排序.那么到底哪一种排序速度更快呢? 下面有一个测试程序: if  (gettimeofday(&tv,

STL中sort排序算法第三个参数_Compare的实现本质

关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数. 重载运算符 全局的比较函数 函数对象 我认为从实现方式看,重载运算符和函数对象实现本质上是一样的:两者都是括号运算符的重载. 重载运算符利用了泛型模板,再重载模板中的括号运算福,接着重载里面的大于小于操作符: 而函数对象则是直接针对自己的对象重载括号运算符. 下图是其中一个泛型模板比较函数,位于头文件stl_function.h中. 『注:本文来自博客园“小