从多集C ++中删除时出现段错误

时间:2015-06-18 11:06:12

标签: c++ stl segmentation-fault multiset

我不知道是什么让这段代码出错。它是一个简单的多重集。没有编译错误,但在执行时机器上出现分段错误。

g ++版本:4.8.2

机器:Ubuntu 14.04

#include <cstdio>
#include <set>

using namespace std;

struct compare
{
    bool operator() (int lhs, int rhs) { return lhs < rhs; }
};
typedef multiset < int, compare >  mi;

mi sett;

int main(void)
{
    sett.insert(5);
    sett.insert(5);
    sett.erase(*sett.begin());
    sett.erase(*sett.rbegin());
    printf("Done\n");
}

2 个答案:

答案 0 :(得分:6)

您的第一个erase有效地清空了您的multiset

来自std::multiset::erase(强调我的)

  

从容器中删除指定的元素   1)移除pos处的元素   2)删除范围内的元素[first;最后),这必须是* this中的有效范围   3)使用键值键删除所有元素。
  擦除元素的引用和迭代器无效。其他引用和迭代器不受影响   迭代器pos必须是有效且可解除引用的。因此,end()迭代器(有效但不可解除引用)不能用作pos的值。

因此,当您第二次尝试erase时,您尝试取消引用std::multiset::end,这是sett.rbegin()为空multiset

返回的内容

答案 1 :(得分:2)

您正在删除迭代器,而不是删除值。

http://en.cppreference.com/w/cpp/container/multiset/erase

使用功能3.删除值为5的所有值。因此,在第一次删除后,您的设置为空。