range-for循环中的访问索引

新手上路,请多包涵

我有一个对象向量,并正在使用 range-for 循环对其进行迭代。我正在使用它从对象中打印一个函数,如下所示:

 vector<thisObject> storedValues;
//put stuff in storedValues
for(auto i:storedValues)
{
   cout<<i.function();
}

但我也想打印索引。我想要的输出是:

 1: value
2: value
//etc

我打算只使用一个每次都增加的计数器,但这似乎非常低效。有没有更好的办法?

原文由 user1599559 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

你不能。 索引 是向量的特定概念,而不是集合的通用属性。另一方面,基于范围的循环是一种通用机制,用于迭代 任何 集合的每个元素。

如果您确实想使用特定容器实现的细节,只需使用普通循环:

 for (std::size_t i = 0, e = v.size(); i != e; ++i) { /* ... */ }

重复这一点:基于范围的循环用于操作任何集合的 _每个元素_,其中集合本身并不重要,并且在循环主体中从未提及容器。它只是您工具箱中的另一个工具,您不会被迫将它用于所有事情。相反,如果您想改变集合(例如删除或随机播放元素),或者使用有关集合结构的特定信息,请使用普通循环。

原文由 Kerrek SB 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 enumerate 视图 range-v3

 std::vector<thisObject> storedValues;
for (auto const& [idx, value] : storedValues | ranges::views::enumerate) {
  std::cout << idx << ": " << value << '\n';
}

C++20 将在 range-for 循环中引入 额外的初始化

 std::vector<thisObject> storedValues;
for (size_t idx = 0; auto value : storedValues) {
  std::cout << idx << ": " << value << '\n';
  ++idx;
}

原文由 cbuchart 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题