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

phr*_*iac 3 c++ stl segmentation-fault multiset

我不知道是什么让这段代码出错.这是一个简单的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");
}
Run Code Online (Sandbox Code Playgroud)

Cor*_*mer 7

你的第一个erase有效地清空你的multiset.

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

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

因此,第二次你试图erase你试图取消引用std::multiset::end,这是sett.rbegin()空的返回multiset