c++ - C++ 中整数循环和迭代器循环之间的差异

标签 c++ loops for-loop iterator iteration

作为 C++ 新手,我刚刚发现迭代器。我意识到可以使用 int 之一或iterators for 循环遍历任何容器。例如考虑一下

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v;
    v.push_back(1);
    v.push_back(4);
    v.push_back(8);

    std::cout << "i is an int: "; 
    for (int i = 0; i<v.size();i++)
    {
       std::cout << v[i] << " ";
    }
    std::cout << std::endl;

    std::cout << "i is an iterator: ";
    for (std::vector<int>::iterator i = v.begin(); i!=v.end();i++)
    {
       std::cout << *i << " ";
    }
    std::cout << std::endl;
}

输出

i is an int: 1 4 8                                                                                                                                   
i is an iterator: 1 4 8  

一般来说,

  • 使用其中一种方法有什么优势吗?
  • 其中一个比另一个更快吗?
  • 我什么时候应该使用int我什么时候应该使用 iterator

最佳答案

使用迭代器的主要原因是提供通用性。特别是,通用算法可以使用迭代器遍历各种容器,迭代器的类型作为模板参数传递:

template <class InIt>
void print(InIt b, InIt e) { 
    while (b != e) {
        std:cout << *b << ' ';
        ++b;
    }
}

在这种情况下,您可以从迭代器中获得优势,因为您可以打印 listmap (仅举几个示例)以及 vector

如果您直接使用已知类型的容器,那么这并不是真正的问题。如果您真的只是想打印出 vector 中的项目,那么使用整数对其进行索引就可以很好地工作。如果您要修改集合而不是仅仅读取其内容,那么使用索引而不是迭代器会具有优势。例如,如果您可能对循环内的 vector 执行 push_back,则整数索引将保持有效,但迭代器可能会失效1

但是,对于您所展示的情况,您可能需要考虑基于范围的 for 循环以避免使用索引或迭代器:

for (auto i : v)
    std::cout << i << ' ';

1. 请注意,尽管标准迭代器确实如此,但如果您确实需要/想要的话,可以创建在这种情况下仍然有效的迭代器类型。例如:https://stackoverflow.com/a/7958561/179910

关于c++ - C++ 中整数循环和迭代器循环之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40160597/

相关文章:

Javascript:如何在上一个函数的最终for循环完成后运行一个函数?

c++ - 在 Android 上编译 OpenSSL

c++ - 适用于 Windows Media Foundation 的 Visual Studio

c++ - 将从视频中获得的帧拆分到单独的 channel 中

javascript - NodeJS 循环内部包含异步函数

loops - 使用流迭代 n 次而不是使用 for 循环来创建 n 个项目

C++ - 回到循环开始而不检查条件

存储出现索引的代码不起作用

c++ - 是否可以使用 C++11 的 for 循环从 vector 中删除?

c++ - 在 Windows 8 上编译 boost 1.55.0 库