在c++中迭代向量时,我注意到标准库中有一个begin()
函数,vector
类的成员函数也有一个begin()
函数。如果有的话,两者之间有什么区别,应该使用哪个?
示例:
vector<int> numbers;
//Code to put values in my vector
for (vector<int>::iterator i = numbers.begin(); i < numbers.end(); i++)
cout << *i << '\n';
对比:
vector<int> numbers;
//Code to put values in my vector
for (vector<int>::iterator i = std::begin(numbers); i < std::end(numbers); i++)
cout << *i << '\n';
3条答案
按热度按时间wd2eg0qa1#
std::begin()
是在C++11中添加的,以便更容易编写泛型代码(例如在模板中)。最明显的原因是普通C风格的数组没有方法,因此没有.begin()
。因此您可以将std::begin()
用于C风格的数组,以及具有自己的begin()
和end()
的STL风格容器。如果你写的代码不是模板,你可以忽略
std::begin()
;如果你突然开始到处使用它,仅仅因为它是新的,你的程序员同事可能会觉得奇怪。osh3o9ms2#
向量的
std::begin()
的实现简单地调用std::vector<T>::begin()
,因此在这种情况下两者之间没有区别。std::begin()
在泛型算法中发挥了作用:f3temu5u3#
如果你的编译器优化了你的代码,那么你使用哪一种格式并不重要。否则,你可能想使用更面向对象的格式:numbers.开始()
此代码已插入Quick Bench进行速度测量:
全部使用STL=libstdc++(GNU)编译,
begin()
的结果如下:| params \ cpu_time(4dp)|格式A|格式B|结论|
| --------------|--------------|--------------|--------------|
| optim = none
compiler = Clang 11.0
std = c++11|一九一四年二月|5.1870|A比B快2.4倍|
| optim = none
compiler = Clang 15.0
std = c++20|2.0666|2.8974|A比B快1.4倍|
| optim = O3
compiler = Clang 11.0
std = c++11|1.1094|1.0130|大致等效运行时间(等效组件)|
| optim = O3
compiler = Clang 15.0
std = c++20|一○ ○九三|一点零零零七|大致等效运行时间(等效组件)|
而对于
end()
:| params \ cpu_time(4dp)|格式A|格式B|结论|
| --------------|--------------|--------------|--------------|
| optim = none
compiler = Clang 11.0
std = c++11|2.5166|2.6341|大致等效运行时间|
| optim = none
compiler = Clang 15.0
std = c++20|二点三六五七|3.8461|A比B快1.6倍|
| optim = O3
compiler = Clang 11.0
std = c++11|1.0045|1.0126|大致等效运行时间(等效组件)|
| optim = O3
compiler = Clang 15.0
std = c++20|1.0047|1.0012|大致等效运行时间(等效组件)|
如果没有优化,
formatA
callq
s<std::vector<int, std::allocator<int> >::begin()>
和end()
,而formatB
callq
s<decltype (({parm#1}.begin)()) std::begin<std::vector<int, std::allocator<int> > >(std::vector<int, std::allocator<int> >&)>
和end()
也分别是。推导formatB的数据类型会浪费时间。通过优化,编译器已经完成了推导,两者都将使用以下程序集,并且除了地址之外没有其他变化: