我应该通过迭代器还是访问运算符迭代向量?

hkB*_*sai 5 c++ performance for-loop stdvector

我有一个声明为的向量

std::vector<int> MyVector;
MyVector.push_back(5);
MyVector.push_back(6);
MyVector.push_back(7);
Run Code Online (Sandbox Code Playgroud)

我应该如何在for循环中使用它?

通过迭代器迭代它?

for (std::vector<int>::iterator it=MyVector.begin(); it!=MyVector.end(); ++it)
{
    std::cout << "Vector element (*it): " << *it << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

或者通过它的访问迭代器?

for (std::vector<int>::size_type i=0; i<MyVector.size(); i++)
{
    std::cout << "Vector element  (i) : " << MyVector.at(i) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在我在互联网上找到的例子中都使用了它们.在所有条件下,其中一个优于另一个吗?如果没有,我什么时候应该更喜欢其中一个呢?

Alo*_*ave 5

第一种格式是更通用的格式,用于迭代标准库容器,因此它更常见,更直观.如果你需要更改容器,那么这个迭代代码仍然没有受到影响.它将适用于每个标准库容器类型,因此它为您提供了更多通用代码.

在第二种格式中,std::vector::at()每次迭代时都会检查边界,因此可能对性能有点不利.第一种格式不存在此开销,因为没有涉及边界检查.注意使用的情况也是如此operator[].
请注意,性能滞后不会像您注意到的那样多,除非您对大量数据进行操作.