vector::begin()和std::begin()之间的差异 < >在C++中迭代向量时,我注意到标准库中有一个开始()和代码>函数,还有一个开始/代码> >作为向量< /代码>类的成员函数。如果有的话,两者之间的区别是什么,应该使用哪一个

vector::begin()和std::begin()之间的差异 < >在C++中迭代向量时,我注意到标准库中有一个开始()和代码>函数,还有一个开始/代码> >作为向量< /代码>类的成员函数。如果有的话,两者之间的区别是什么,应该使用哪一个,c++,vector,C++,Vector,例如: vector<int> numbers; //Code to put values in my vector for (vector<int>::iterator i = numbers.begin(); i < numbers.end(); i++) cout << *i << '\n'; 向量数; //将值放入向量的代码 对于(向量::迭代器i=numbers.begin();i

例如:

vector<int> numbers;
//Code to put values in my vector
for (vector<int>::iterator i = numbers.begin(); i < numbers.end(); i++)
    cout << *i << '\n';
向量数;
//将值放入向量的代码
对于(向量::迭代器i=numbers.begin();istd::begin()
,以便更容易编写通用代码(例如在模板中)。最明显的原因是普通C样式数组没有方法,因此没有
.begin()
。因此,您可以将
std::begin()
与C样式数组一起使用,也可以使用具有自己的
begin()
end()
的STL样式容器


如果编写的代码不是模板,则可以忽略
std::begin()
;如果只是因为它是新的而突然开始在任何地方使用它,您的程序员同事可能会觉得很奇怪。

向量的
std::begin()
的实现只是调用
std::vector::begin()
,因此在这种情况下两者之间没有区别

其中
std::begin()
属于通用算法:

template<typename Container>
void my_algorithm(Container c) {
    using std::begin;
    using std::end;
    auto const start = begin(c);  // ADL will find the appropriate overload
    auto const finish = end(c);
    // ... rest of code ...
}
模板
void my_算法(容器c){
使用std::begin;
使用std::end;
auto const start=begin(c);//ADL将找到适当的重载
自动常量完成=结束(c);
//…其余的代码。。。
}

对于容器,它们是相同的。但是
std::begin
也适用于内置数组,这在template functions.OT中非常有用,但是
++i
可能比
i++
更有效,因为后者返回一个迭代器的值可能是重复的,那么仅仅因为你想保持一致就使用它怎么样?@BenjaminLindley:我不认为这正是@RalphWaldoEmerson所说的“”愚蠢的一致性是弱智的妖精,“但我确实认为,如果我们几十年来一直以老方法使用
std::begin()
,看到它无缘无故地被使用,那会让人分心。它需要更多的输入,而没有任何好处。@JohnZwinck
begin(vec)
(多亏了ADL)比
vec.begin()更少的输入
:)考虑到如果
std::begin
可用,那么基于范围的循环和
auto
也是可用的;我宁愿不看第二个版本!@MattMcNabb:这是一个很好的观点,在C++11中不再需要使用迭代器。
template<typename Container>
void my_algorithm(Container c) {
    using std::begin;
    using std::end;
    auto const start = begin(c);  // ADL will find the appropriate overload
    auto const finish = end(c);
    // ... rest of code ...
}