假设我有一个如下定义的字符串向量。
std::vector<std::string> names;
names.push_back( "Zero" );
names.push_back( "One" );
names.push_back( "Two" );
names.push_back( "Three" );
names.push_back( "Four" );
names.push_back( "Five" );
names.push_back( "Six" );
names.push_back( "Seven" );
names.push_back( "Eight" );
names.push_back( "Nine" );
另外,假设我有一个向量来定义要循环的元素:
std::vector< int > indices;
indices.push_back( 0 );
indices.push_back( 5 );
indices.push_back( 6 );
如何根据向量names
的元素迭代向量indices
,例如访问名称:"Zero"
,"Five"
和{{1} }?我知道:
"Six"
迭代我们可以找到模式的所有元素或元素,例如,每个其他元素等。但是如何迭代没有模式或难以找到模式的元素?如何将矢量用于另一个矢量的迭代?类似的东西:
for( vector<string>::iterator it=names.begin() ; it < names.end(); it++)
答案 0 :(得分:3)
您的建议几乎是正确的。而不是insdices.at(it)
,您应该取消引用迭代器。但你可以这样做:
for(int index : indices) {
names[index];
}
如果您无法证明vector::at
&gt;,则可以使用names.size()
所有indices[i]
都是i
。
答案 1 :(得分:2)
就这么简单:
for( vector<int>::iterator it=indices.begin() ; it != indices.end(); ++it )
{
names.at( *it );
names[*it]; // for faster but unvalidated access
...
}
注意:++it
可能更快(但不能更慢),因此通常在不关心它是postfix还是前缀形式时使用。通常也使用it != container.end()
,因为它更通用(少于随机访问迭代器,但不适用于前向迭代器)。
答案 2 :(得分:1)
您还可以使用lambda的std::for_each
调用来访问指标(版本1)
此外,您可以使用基于范围的for循环rvalues
(版本2)
#include <vector>
#include <algorithm>
int main()
{
std::vector<std::string> names;
names.push_back("Zero");
names.push_back("One");
names.push_back("Two");
names.push_back("Three");
names.push_back("Four");
names.push_back("Five");
names.push_back("Six");
names.push_back("Seven");
names.push_back("Eight");
names.push_back("Nine");
std::vector< int > indices;
indices.push_back(0);
indices.push_back(5);
indices.push_back(6);
// version 1
std::for_each(std::cbegin(indices), std::cend(indices),
[&](auto &idx) { std::cout << names.at(idx) << "\n";});
// version 2
for (auto &&idx : indices)
std::cout << names.at(idx) << "\n";
return 0;
}