vector :: begin()和std :: begin()之间的区别

时间:2014-10-10 00:58:40

标签: c++ vector

在c ++中迭代向量时,我注意到标准库中有begin()函数,begin()作为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';

VS

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';

2 个答案:

答案 0 :(得分:20)

在C ++ 11中添加了

std::begin(),以便更容易编写通用代码(例如在模板中)。最明显的原因是普通的C风格数组没有方法,因此没有.begin()。因此,您可以将std::begin()与C风格的数组一起使用,也可以将STL风格的容器与begin()end()一起使用。

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

答案 1 :(得分:1)

对于向量的std::begin()的实现只是调用std::vector<T>::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 ...
}