迭代向量和其他 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,并且只是通过切换到第一种方法,我设法让所有案例都通过了,我是否错过了区分它们的东西,或者这只是一个巧合(因为它们的运行时间之间的实际差异很小,只是在限制的另一边)。我找不到任何东西,所以如果您有任何链接或见解,请分享。
【问题讨论】:
你没有迭代int
s,是吗?
如果你复制了一个很大的结构,当然这不一样。
for(C c: vec)
和for(/*const*/C& 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&
【讨论】:
好的,所以我明白了,因为我实际上是使用自定义结构作为模板类,所以制作副本开始需要时间,如果我只是引用它们,它会更快,谢谢。以上是关于迭代向量和其他 stl 容器的风格之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
如何使 c++ 代码既可用于 Qt 项目(QTL 风格)也可用于 C++ 项目(STL 风格)