使用另一个向量

时间:2016-04-26 17:56:50

标签: 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"   );
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++)

3 个答案:

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