每个标准容器具有begin和end方法,返回的迭代器是容器.然而,C++ 11显然已经引入自由函数调用std::begin和std::end该调用begin和end成员函数.所以,而不是写作
auto i = v.begin();
auto e = v.end();
Run Code Online (Sandbox Code Playgroud)
你会写的
using std::begin;
using std::end;
auto i = begin(v);
auto e = end(v);
Run Code Online (Sandbox Code Playgroud)
在他的演讲中,编写现代C++,Herb Sutter说当你想要容器的开始或结束迭代器时,你应该总是使用自由函数.但是,他没有详细说明你想要的原因.查看代码,它可以为您节省一个字符.因此,就标准容器而言,自由函数似乎完全没用.Herb Sutter表示非标准容器有好处,但他再次没有详细说明.
因此,问题是除了调用相应的成员函数版本之外,自由函数版本究竟做了什么,std::begin并且std::end做了什么,为什么要使用它们呢?
在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';
Run Code Online (Sandbox Code Playgroud)
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';
Run Code Online (Sandbox Code Playgroud) (另请参阅是否有一种很好的方法可以在C++中为自定义类型手写所有12个所需的Container函数?)
对于像这样的课程
namespace JDanielSmith {
class C
{
const size_t _size;
const std::unique_ptr<int[]> _data;
public:
C(size_t size) : _size(size), _data(new int[size]) {}
inline const int* get() const noexcept { return _data.get(); }
inline int* get() noexcept { return _data.get(); }
size_t size() const noexcept { return _size; }
};
}
Run Code Online (Sandbox Code Playgroud)
暴露迭代的首选方式是什么?我应该写begin()/ end()(和cbegin()/ cend())成员函数吗?
const int* cbegin() const {
return get();
}
const int* cend() const {
return cbegin() + size();
}
Run Code Online (Sandbox Code Playgroud)
或者这些应该是非会员职能? …
有时,我想自己从C++标准中搜索答案.阅读标准可能有助于我概述所提出的语言原则.
通过搜索互联网,我感到困惑的是充斥着C++论坛和帮助网站.它们提供各种PDF文件供阅读.
我不知道应采用哪个PDF文件和/或哪个版本.
我找到了几个网站:
我想知道是否有一个标准发布的网站.在解决问题时我应该参考哪个版本?有人说C++ 98,有些人说C++ 11,甚至是最新的工作草案.(许多草稿令我困惑).
编辑
我从标准中找到了一个有用的信息,其中写道:
除了最终的标准/报告外,所有C++委员会文件都是免费公开发布的,包括所有工作草案,其中许多与发布的标准非常接近.2012年1月的工作草案包含C++ 11标准以及次要的编辑更改.
2012年1月的工作草案是N3337.
希望这能帮到你们.
编辑
来自 Wiki C++ 11,它写道:
与已发布的C++ 11标准最相似的工作草案是2012年1月12日的N3337; 它只有C++ 11标准的编辑更正.
我想获得一些陀螺仪读数的平均值,它涉及将一个std::vector<double>类型与一个双精度类型相除,但是出现以下错误,该错误报告
无效的二进制二进制操作数(“ std :: vector”和“ double”)
我该如何解决?
double n_readings;
std::vector<double> gyro_reading;
for(int i = 0; i < n_readings; i++) {
gyro_reading.push_back(gyro_z());
msleep(1);
}
double average = gyro_reading/n_readings;
Run Code Online (Sandbox Code Playgroud)