16

我你们大家

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

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

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 的两个实现是否表现不同?

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

可能我必须为这种操作更改数据结构

4

2 回答 2

2

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

于 2012-04-27T13:45:01.870 回答
-2

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

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

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

于 2015-06-02T13:48:33.897 回答