C++中使用range-based for迭代器时如何高效获取元素索引号?
关于range-based for循环获取vector元素索引的实现方案
原生的C范围for循环(range-based for)本身不直接提供当前元素的索引能力,需要借助额外逻辑实现,不同C标准版本下的最优方案如下:
C++20及以上版本(最优方案)
直接使用标准库提供的std::views::enumerate,是目前行业最推荐的无额外开销实现方式:
#include <vector> #include <ranges> int main() { std::vector<int> test_vec = {10, 20, 30, 40, 50}; // 结构化绑定直接拿到索引和元素 for (const auto [index, element] : std::views::enumerate(test_vec)) { // index即为当前元素的索引号,类型为std::size_t // element为当前元素的const引用,需要修改的话去掉const改为auto&即可 } return 0; }
C++11/14/17 旧标准版本
方案1:外部维护计数器(优先选择,性能开销为0)
#include <vector> int main() { std::vector<int> test_vec = {10, 20, 30, 40, 50}; std::size_t index = 0; for (const auto& element : test_vec) { // 直接使用index作为当前元素索引号 index++; } return 0; }
注意:计数器类型需使用std::size_t和vector的size()返回值类型对齐,避免类型溢出或者编译警告。
方案2:迭代器计算索引(仅适合连续存储容器)
如果已经在使用迭代器遍历,也可以通过迭代器偏移计算索引,仅适用于vector、std::array这类随机访问迭代器容器:
#include <vector> #include <iterator> int main() { std::vector<int> test_vec = {10, 20, 30, 40, 50}; for (auto iter = test_vec.begin(); iter != test_vec.end(); ++iter) { std::size_t index = std::distance(test_vec.begin(), iter); const auto& element = *iter; } return 0; }
内容的提问来源于stack exchange,提问作者julius72
相关产品推荐
相关产品推荐

