迭代器是否有办法在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);
}
答案 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)
myVector
可以让代码更有效率
std::vector<mystruct>::const_iterator theEnd;
for (it=myVector.begin();it!=theEnd;++it)
注意++
我认为&(*it)
应该有用。