【问题标题】:Difference between vector::begin() and std::begin()vector::begin() 和 std::begin() 之间的区别
【发布时间】:2014-12-05 02:03:39
【问题描述】:

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

对比:

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

【问题讨论】:

标签: c++ vector


【解决方案1】:

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

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

【讨论】:

  • 仅仅因为你想保持一致而使用它怎么样?
  • @BenjaminLindley:我不认为这正是@RalphWaldoEmerson 所说的“愚蠢的一致性是小脑袋的妖精”时所想的,但我确实认为这会分散注意力请参阅 std::begin() 无缘无故地使用了几十年的老方法。它需要更多的输入而没有任何好处。
  • @JohnZwinck begin(vec)(感谢 ADL)比 vec.begin() 打字少:)
  • 考虑到如果std::begin 可用,那么基于范围的for 循环和auto 也是可用的;我宁愿根本看不到第二个版本!
  • @MattMcNabb:这很好,在 C++11 中根本不再需要迭代器的许多用途。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2017-07-03
    • 2013-12-02
    • 2016-09-12
    • 2015-10-14
    • 2011-08-20
    • 2013-09-06
    相关资源
    最近更新 更多