Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用另一个向量遍历向量的特定元素_C++_Arrays_Loops_Vector_Iterator - Fatal编程技术网

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;
}