2014-10-10 95 views
13

在C++中遍历一个向量时,我注意到标准库中有一个begin()函数,并且还有一个begin()作为vector类的成员函数。如果有的话,两者之间的区别是什么,哪一个应该用于另一个?vector :: begin()和std :: 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'; 

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

集装箱它们是相同的。但'std :: begin'也适用于内置数组,这在模板函数中非常有用。 – texasbruce 2014-10-10 01:01:19

+0

OT,但'++ i'可能比'i ++'效率更高,因为后者通过值 – 2014-10-10 02:29:48

+0

返回一个迭代器[当何时使用std :: begin和std :: end而不是容器特定版本](http ://stackoverflow.com/questions/8452130/when-to-use-stdbegin-and-stdend-instead-of-container-specific-versions) – edmz 2014-10-10 07:58:54

回答

15

std::begin()加入在C++ 11,使其更容易编写通用代码(在模板例如)。最明显的原因是普通的C风格的数组没有方法,因此没有.begin()。因此,您可以使用带有C型阵列的std::begin()以及具有自己的begin()end()的STL型容器。

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

+0

如何使用它只是因为你想要一致? – 2014-10-10 01:09:22

+0

@BenjaminLindley:我不认为@RalphWaldoEmerson当他说“愚蠢的一致性是小脑袋的大地精者”时,他确实没有想到这一点,但我认为这会让人分心,看到std :: begin( )''''''''''''''''''''''''''当我们以前的方式使用了几十年的时候,没有任何理由,它需要更多的打字才能带来好处 – 2014-10-10 01:12:22

+0

@BenjaminLindley我知道你是对的,但我只是不想。:(是同样为++它为迭代器和i ++为整数只是我滚动的方式 – 2014-10-10 01:16:15

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 ... 
} 
相关问题