如何获取std :: set的第一个元素

时间:2012-04-27 13:32:34

标签: c++ stl iterator set

我是你们所有人,

我的软件中发现了一个奇怪的错误。

在while循环中,我从std :: set中删除元素,我希望始终采用第一个元素,直到容器为空:

std::set< int*> nodes;
// Fill nodes 
for (int i=0; i<10;i++)
   nodes.insert(new int);
//
while (!nodes.empty())
{
int* pivot  = (*nodes.begin());
// do some operation with pivot erasing some elements from nodes
}

我发现以这种方式实现第一个元素适用于gcc而不是MSVC,它会在我尝试取消引用(*nodes.begin())迭代器的地方崩溃。

std :: set的两个实现是否表现不同?

我希望有一个没有实现差异的数据结构,是否可能?

我可能必须更改此类操作的数据结构

2 个答案:

答案 0 :(得分:2)

您的代码在VS2010中运行良好,也许您应该更新您的vcc。

答案 1 :(得分:-2)

您不能在这样的集合上使用迭代器,因为从集合中删除元素会使迭代器无效。当集合的大小低于某个阈值时(基于设置迭代器时的初始大小),它将修改堆上数据的底层存储,这将使您的迭代器指针指向垃圾。

请参阅迭代器有效性: http://www.cplusplus.com/reference/set/set/erase/

(* nodes.begin())做你想要的,你只是不能从你的迭代中删除