迭代通过std :: set(c ++)的麻烦

时间:2011-08-04 13:47:24

标签: c++ iterator set

我整天都有套装问题。有些我能解决,有些则不能。这个从早上起就困扰着我,我已经没有耐心了。请帮忙,强大的stackoverflow!

所以,我有一个包含我的自定义对象的集合,它被称为“vect”并且基于eigen :: matrix。这意味着,我使用[]运算符从vects中获取值。

set<vect*> *tvps=getTheSet();

for (set<vect*>::iterator iter = tvps->begin(); iter != tvps->end(); ++iter)
{
    vect v= **iter;   // Don't really know why two asterisks,
                      // but my compiler would complain
    int x=v[0];
    int y=v[1];
    doStuffWith( v[0],v[1]);

}

现在,这将编译并运行一切。但是我从迭代器得到的值是30%垃圾:

x: 110   y: 90
x: 230   y: 130
x: 250   y: 100
x: 230   y: 130
x: 110   y: 290
x: 140   y: 260
x: 180   y: 280
x: 150   y: 210
x: -2147483648   y: 0
x: 180   y: 280
x: 170   y: 230
x: 240   y: 270
x: -2147483648   y: 0
x: -429917536   y: 0
x: 0   y: -2147483648

我检查了集合放在一起的位置,其中放入了值。只有10到300之间的那些......按照预期。我怎么在其中找到其他人?我搞砸了迭代器吗?

2 个答案:

答案 0 :(得分:1)

你有一组指向矢量的指针。首先在**iter中取消引用迭代器,然后将指针放在里面。

保持指针也可能导致您的问题:如果您释放或忘记初始化其中一些,结果将是垃圾。

答案 1 :(得分:1)

为什么会发生这种情况有几种可能性:

  • 您是否在重复使用该套装。如果是,请重新使用clear()吗?
  • 您正在存储集合中向量的指针,您是否正在更改集合中的向量?

也许你想将指针存储到向量中,否则编译器会因为它不知道如何比较两个向量而给你一个错误。为什么不尝试直接实现comparison函数和存储向量?这样你的工作就会容易得多,而且容易出错。

你现在遇到的问题是集合中的元素似乎没有被排序..实际上它们是由指针值排序的,而不是由X和Y排序的(我想这就是你想要的)