【问题标题】:how to get iterator to a particular position of a vector如何将迭代器获取到向量的特定位置
【发布时间】:2011-10-19 14:34:52
【问题描述】:

假设我有一个

std::vector<int> v
//and ...
for(int i =0;i<100;++i) 
 v.push_back(i);

现在我想要一个迭代器,比如说向量的第 10 个元素。

不做下面的做法

std::vector<int>::iterator vi;
vi = v.begin();
for(int i = 0;i<10;i++)
  ++vi;

因为这会破坏为向量提供随机访问迭代器的优势。

【问题讨论】:

标签: c++ iterator


【解决方案1】:

这适用于任何随机访问迭代器,例如来自 vectordeque 的迭代器:

std::vector<int>::iterator iter = v.begin() + 10;

如果您想要一个适用于任何类型迭代器的解决方案,请使用next

std::vector<int>::iterator iter = std::next(v.begin(), 10);

或者,如果您没有使用 C++11 实现,advance:

std::vector<int>::iterator iter = v.begin();
std::advance(iter, 10);

【讨论】:

  • 谢谢... 现在就为我添加 10 部作品。但我会注意提前。
  • 我更喜欢 std::advance() 因为它适用于任何迭代器;这样您就不会被绑定到特定的容器。
  • @Matt :很可能,如果您的算法需要第 n 个元素访问,那么除了随机访问迭代器之外的任何其他方法都将是无用的低效;所以实际上最好使用operator+ 而不是std::advance 并使用错误的迭代器类型获得编译器错误。
  • 针对 C++11 和通用答案 next 进行了升级。还没遇到那个!为了增加您对随机访问迭代器的区别 - + 语法看起来不错,并且会根据 stackoverflow.com/questions/2152986/… 捕获任何更改为非随机访问容器的尝试
【解决方案2】:

只需将 10 添加到迭代器即可。它们旨在“感觉”像指针。

【讨论】:

  • 你不想加9吗?加 0 移动到第 1 个元素,加 1 移动到第 2 个元素,... 加 n-1 移动到第 n 个元素。
  • 那是误导。你在第一个元素处,它的索引为 0,所以如果你添加 0,你不会移动,你仍然在第一个元素处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 2020-11-06
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
相关资源
最近更新 更多