2012-04-27 488 views
14

我都是如何获得std :: set的第一个元素

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

内部while循环,我从一个std删除元素::集,我想总是直到容器是空采取的第一个元素:

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 
} 

我发现,执行的第一个元素这样的作品与海湾合作委员会,但不与MSVC,它崩溃,我试图取消引用(*nodes.begin())迭代器。

std :: set的两个实现的行为是否有所不同?

我想要一个没有实现差异的数据结构,这有可能吗?

也许我必须改变VS2010数据结构,对于这种操作

+0

您提领后会怎样删除? – Nick 2012-04-27 13:34:41

+5

什么是“做一些操作与枢轴擦除节点的一​​些元素” – 2012-04-27 13:34:57

+4

只是像这样解除*(nodes.begin()) – v01d 2012-04-27 13:35:02

回答

2

你的代码工作做好,mybe您应该更新您的VCC。

-3

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

参见下迭代器的有效性: http://www.cplusplus.com/reference/set/set/erase/

(* nodes.begin()),你想要做什么,你就不能从一个设置你的迭代通过