【问题标题】:How to get the first element of a std::set如何获取 std::set 的第一个元素
【发布时间】:2012-05-08 06:12:02
【问题描述】:

我是你们,

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

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

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

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

【问题讨论】:

  • 什么是“通过枢轴擦除节点中的某些元素进行一些操作”
  • 像这样取消引用 *(nodes.begin())
  • 请提供complete test-case 而不仅仅是这个sn-p。
  • @v01d,这应该没什么区别,. 应该比higher precedence 有*,除非实现被破坏。 (非常破碎)
  • @linello 不,它没有,问题几乎肯定出在你没有发布的代码中。

标签: c++ stl iterator set


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-11
      • 2015-12-08
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2014-09-08
      • 1970-01-01
      相关资源
      最近更新 更多