C++ 使用另一个向量遍历向量的特定元素
假设我有一个字符串向量,定义如下C++ 使用另一个向量遍历向量的特定元素,c++,arrays,loops,vector,iterator,C++,Arrays,Loops,Vector,Iterator,假设我有一个字符串向量,定义如下 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" );
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" );
迭代所有元素或我们可以找到模式的元素,例如,每个其他元素,等等。但是迭代没有模式或难以找到模式的元素怎么样?一个向量如何用于另一个向量中的迭代?比如:
for( vector<int>::iterator it=indices.begin() ; it < indices.end(); it++ )
{
names.at( indices.at( it ) )
...
}
for(vector::iterator it=index.begin();it
就这么简单:
for( vector<int>::iterator it=indices.begin() ; it != indices.end(); ++it )
{
names.at( *it );
names[*it]; // for faster but unvalidated access
...
}
for(vector::iterator it=index.begin();it!=index.end();++it)
{
姓名。地址(*it);
名称[*it];//用于更快但未经验证的访问
...
}
注意:
++it
可以更快(但不能更慢),因此通常在不关心它是后缀还是前缀形式时使用<代码>它!=通常也使用container.end(),因为它更通用(不适用于随机访问迭代器,但不适用于前向迭代器等)。简单如下:
for( vector<int>::iterator it=indices.begin() ; it != indices.end(); ++it )
{
names.at( *it );
names[*it]; // for faster but unvalidated access
...
}
for(vector::iterator it=index.begin();it!=index.end();++it)
{
姓名。地址(*it);
名称[*it];//用于更快但未经验证的访问
...
}
注意:
++it
可以更快(但不能更慢),因此通常在不关心它是后缀还是前缀形式时使用<代码>它!=通常也使用container.end(),因为它更通用(不适用于随机访问迭代器,但不适用于转发迭代器等)。您的建议几乎是正确的。您应该取消对迭代器的引用,而不是insdices.at(it)
。但你可以这样做:
for(int index : indices) {
names[index];
}
或者,如果你不能证明
names.size()
索引[i]
对于所有i
你的建议几乎是正确的,你可以使用vector::at
。您应该取消对迭代器的引用,而不是insdices.at(it)
。但你可以这样做:
for(int index : indices) {
names[index];
}
或者,如果您无法证明
names.size()
索引[i]
对于所有i
您也可以使用std::for_each
调用和lambda来访问索引(版本1)
此外,您可以将基于范围的for循环与右值一起使用(版本2)
#包括
#包括
int main()
{
std::矢量名称;
名称。推回(“零”);
姓名。推回(“一”);
姓名。推回(“两”);
姓名。推回(“三”);
姓名。推回(“四”);
姓名。推回(“五”);
姓名。推回(“六”);
姓名。推回(“七”);
姓名。推回(“八”);
姓名。推回(“九”);
标准:向量指数;
指数。推回(0);
指数。推回(5);
指数。推回(6);
//版本1
std::for_each(std::cbegin(索引),std::cend(索引),
[&](auto&idx){std::cout您还可以使用带有lambda的std::for_每个
调用访问标识(版本1)
此外,您可以将基于范围的for循环与右值一起使用(版本2)
#包括
#包括
int main()
{
std::矢量名称;
名称。推回(“零”);
姓名。推回(“一”);
姓名。推回(“两”);
姓名。推回(“三”);
姓名。推回(“四”);
姓名。推回(“五”);
姓名。推回(“六”);
姓名。推回(“七”);
姓名。推回(“八”);
姓名。推回(“九”);
标准:向量指数;
指数。推回(0);
指数。推回(5);
指数。推回(6);
//版本1
std::for_each(std::cbegin(索引),std::cend(索引),
[&](自动和idx){std::cout显然,auto
对于C+11
是有问题的。编译器抱怨auto更改了C++11中的含义;请将其删除。这是特定于C++14
的。如果您使用C++11
您必须用特定类型替换auto
。显然,auto
是有问题的ematic用于C+11
。编译器抱怨自动更改C++11中的含义;请将其删除。这是特定于C++14
。如果使用C++11
,则必须用特定类型替换auto
。
#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;
}