迭代向量和其他 stl 容器的风格之间的区别

Posted

技术标签:

【中文标题】迭代向量和其他 stl 容器的风格之间的区别【英文标题】:Difference between styles of iterating over vectors and other stl containers 【发布时间】:2019-01-31 10:07:19 【问题描述】:

假设有一个 stl 容器,为简单起见,我将使用声明为的向量

得到答案后,我意识到这是因为我实际上并没有迭代int,而是自定义数据结构模板T,只是进行了编辑,以便将来有人可能会发现它更容易理解。

std::vector <T> vec;

现在有两种常用的方法来迭代它。

1.

for(std::vector<T>::iterator it = vec.begin(); it != vec.end(); ++it)

    /* std::cout << *it; ... */

2.

for(T t: vec)

    /* std::cout << t; ... */

现在我一直认为这两种方法在底层或多或少是相同的,并且应该具有相似的运行时间,但最近在hackerearth 上的比赛中,第二个方法(我通常的 Goto)在最后一个测试用例中给出了 TLE,并且只是通过切换到第一种方法,我设法让所有案例都通过了,我是否错过了区分它们的东西,或者这只是一个巧合(因为它们的运行时间之间的实际差异很小,只是在限制的另一边)。我找不到任何东西,所以如果您有任何链接或见解,请分享。

【问题讨论】:

你没有迭代ints,是吗? 如果你复制了一个很大的结构,当然这不一样。 for(C c: vec)for(/*const*/C&amp; c: vec)有区别,前者是copy,后者是reference。 延伸阅读:en.cppreference.com/w/cpp/language/range-for 【参考方案1】:

这会将变量从向量复制到 t:

for(int t: vec)

    /* std::cout << t; ... */

对于int,我认为差别不大。

但是,如果您使用的是带有复制构造函数的类,...您可以尝试使用引用:

for(int& t: vec)

    /* std::cout << t; ... */

如果它不修改变量,请使用const int&amp;

【讨论】:

好的,所以我明白了,因为我实际上是使用自定义结构作为模板类,所以制作副本开始需要时间,如果我只是引用它们,它会更快,谢谢。

以上是关于迭代向量和其他 stl 容器的风格之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

6.5-数据结构&算法-标准模板STL/STL容器/向量

如何使 c++ 代码既可用于 Qt 项目(QTL 风格)也可用于 C++ 项目(STL 风格)

STL迭代器之向量

在 C++ 中为我自己的自定义向量模板类实现迭代器(类似于 STL)[重复]

C++:问题向量 STL

字符串, 向量和数组 术语表