在向量中的每个元素中获取对象

时间:2011-08-13 00:50:54

标签: c++

迭代器是否有办法在C ++标准库向量的每个元素中返回一个对象?

我有这段代码:

struct mystruct {
  int field1;
}

int DoSomethingWithMyStruct(mystruct& a);

std::vector<mystruct> myVector;
std::vector<mystruct>::iterator it;

mystruct s1,s2, temp;
s1.field1=1;
s2.field1=2;

for (it=myVector.begin();it!=myVector.end();it++)
{
   //I want to call DoSomethingWithMyStruct, so I have to pass in mystruct object.
   //can I use iterator to get the object of each element in myVector without having to create a temporary mystruct object and pass it in?
   //I'm looking for an easier way than having to do this:
   temp.field1 = it->field1;
   DoSomethingWithMyStruct(temp);

}

5 个答案:

答案 0 :(得分:3)

除了其他人所说的,你可以这样做:

#include <algorithm>

std::for_each(myVector.begin(), myVector.end(), DoSomethingWithMyStruct);

它简短而简洁。无需手动循环。

答案 1 :(得分:2)

是:

DoSomethingWithMyStruct(*it);

答案 2 :(得分:1)

只需取消引用迭代器:

std::vector<mystruct>::iterator it, end;
for (it = myVector.begin(), end = myVector.end(); it != end; ++it) {
   DoSomethingWithMyStruct(*it);
}

或者我在这里错过了一些东西......?

更进一步,还有其他方法可以迭代。您可以使用BOOST_FOREACH或C ++ 0x ranged-for来简化循环。您也可以使用像std::for_each这样的算法来完全删除它!


(请记住,it->field1就像(*it).field1,所以你已经这样做了......即使你继续使你的代码比以后更复杂! )功能

答案 3 :(得分:0)

只需简单地取消引用您的迭代器。 *it,您获得了mystruct。在这方面,它们的行为就像指针一样。

但是如果你想知道如何迭代向量的所有元素的所有字段,那么元素就是多态的;例如std::vector<Base*>,这有点困难。由于C ++没有可以自动(半)自动生成的反射,因此需要手动完成。我想到了类似于访客模式的东西。

答案 4 :(得分:-3)

  1. 您尚未填充myVector
  2. 可以让代码更有效率

    std::vector<mystruct>::const_iterator theEnd;

    for (it=myVector.begin();it!=theEnd;++it)

    注意++

  3. 的位置
  4. 我认为&(*it)应该有用。