【问题标题】:How to get int position of vector loop如何获取向量循环的int位置
【发布时间】:2019-03-22 23:44:52
【问题描述】:

如何获得这个循环的 int 位置?谢谢。

auto a = vect.begin();
auto b = vect2.begin();
auto c = vect3.begin();
for (; a != vect.end() && b != vect2.end() && c != vect3.end(); a++, b++, c++) {

}

我需要打印其他变量的值,但我需要得到这个向量循环的实际无符号整数位置。

我需要使用这个向量的这个位置来打印双向量。

以及如何获取向量的最后一个索引。

我的问题是 for 具有多个向量的循环,并从中获取索引以仅使用最后一个索引。

【问题讨论】:

标签: c++ loops vector


【解决方案1】:

正如 Angew 所示,当您需要索引时,一个简单的索引循环可能更可取。

但是,也可以从迭代器中获取索引:

auto a = vect.begin();
auto b = vect2.begin();
auto c = vect3.begin();
for (/*the loop conditions*/) {
    auto index = a - vect.begin();
}

也可以使用std::distance 获取前向迭代器的索引,但在循环中使用它是不明智的,因为对于非随机访问迭代器而言,复杂性将是线性的。

对于前向迭代器(以及必须支持前向迭代器的通用代码),您可以编写一个包含索引变量和迭代器的循环。

附:对迭代器使用预增量可能更可取。可能只在调试版本中很重要。

【讨论】:

  • 如果你使用std::distance,我会支持的。
  • @MaxLanghof 我故意不在这里使用std::distance。如果迭代器是不可随机访问的,则循环内的std::distance 会将循环的时间复杂度增加到 O(N*N)。在通用代码中,您应该使用单独的索引变量。但这不是必需的,因为容器是向量。
  • 这是一个很好的推理。也许您应该将其添加到答案中? (无论如何都增加了)。
  • 请告诉我如何获取向量的最后一个索引?谢谢。
  • @Adam 最后一个索引是元素数减一。
【解决方案2】:

很简单:如果您需要索引,请不要使用迭代器:

for (
  size_t idx = 0, idxEnd = std::min({vect.size(), vect2.size(), vect3.size()});
  idx < idxEnd;
  ++idx
)
{
  auto& obj1 = vect[idx];
  auto& obj2 = vect2[idx];
  auto& obj3 = vect3[idx];
}

(上面的代码在循环开始时初始化idxEnd一次,这样就不会在每次迭代时不必要地重新计算它。这只是一个优化)。

【讨论】:

  • 我需要使用这个向量的这个位置来打印双向量。有可能通过这种方式吗?谢谢。
  • @Adam idx 是向量中当前迭代元素的索引(位置)。我认为这就是你所需要的。如果不是,请澄清您的问题,以表明您实际上想要做什么。
  • std::min 定义在哪里?
  • @Adam idxEnd 在所示的 sn-p 中定义。特别是在for 表达式的init-statement 条件 部分。
  • @Adam 在我看来,你似乎或多或少地盲目地尝试你在这里遇到的任何事情,这并不是 SO 对你真正有益的方式。也许您可能想选择good book 来更深入地掌握 C++ 基础知识?
猜你喜欢
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
相关资源
最近更新 更多