我不知道是什么让这段代码出错。它是一个简单的多重集。没有编译错误,但在执行时机器上出现分段错误。
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");
}
答案 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的所有值。因此,在第一次删除后,您的设置为空。