有没有到底应该用来代替自由函数来解释,当容器开始和特定版本的任何一般的偏好或规则std::begin和std::end?
这是我的理解是,如果该函数是一个模板,其中容器类型是模板参数则std::begin和std::end应使用,即:
template<class T> void do_stuff( const T& t )
{
std::for_each( std::begin(t), std::end(t), /* some stuff */ );
}
Run Code Online (Sandbox Code Playgroud)
在其他场景中,例如已知容器类型的标准/成员函数呢?它仍然是更好的做法是使用std::begin(cont)和std::end(cont)或应容器的成员函数cont.begin()和cont.end()首选?
我在假设有通过调用在性能上没有任何好处纠正cont.end()过std::end(cont)?
错误如下:
请求'arr'中的成员'begin','end'是非类型int [5],无法从表达式错误中推断出来.
我的代码:
#include <iostream>
using namespace std;
int main()
{
int * mypointer;
int arr[5] = {1,3,5,7,9};
mypointer = arr;
for(auto it = arr.begin(); it != arr.end(); ++it) {
cout<<*mypointer<<endl;
mypointer++;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在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)
或者这些应该是非会员职能? …
假设我有一个使用Array of Structures(AoS)内存布局的大代码.我想在C++中构建一个零成本的抽象,它允许我在尽可能少的重构努力之间切换AoS和SoA.例如,使用具有访问成员函数的类
struct Item{
auto& myDouble(){ return mDouble; }
auto& myChar(){ return mChar; }
auto& myString(){ return mString; }
private:
double mDouble;
char mChar;
std::string mString;
};
Run Code Online (Sandbox Code Playgroud)
它在循环中的容器内使用
std::vector<Item> vec_(1000);
for (auto& i : vec_)
i.myDouble()=5.;
Run Code Online (Sandbox Code Playgroud)
我想改变第一个片段,而第二个片段保持相似...例如,有类似的东西
MyContainer<Item, SoA> vec_(1000)
for (auto& i : vec_)
i.myDouble()=5.;
Run Code Online (Sandbox Code Playgroud)
我可以使用"SoA"或"AoS"模板参数选择内存布局.我的问题是:这样的事情存在于某个地方吗?如果没有,最好如何实施?
c++ abstraction design-patterns data-oriented-design template-meta-programming
我最近介绍了通用编程库的设计,如STL,boost :: graph,boost PropertyMaps http://www.boost.org/doc/libs/1_54_0/libs/property_map/doc/property_map.html
使用像get(PropertyMap,key)这样的自由函数而不是像PropertyMap.get(key)这样的成员函数的原理是什么?
我知道这些函数的最通用形式是在"boost"命名空间中定义的.假设我在命名空间"project"中定义了一个新的PropertyMap,定义它的相应"get"函数的最佳位置是什么?"提升"或"项目"
我目前正在编写一个处理通用容器的函数模板.我想用std::begin()和std::end(),因上述原因在这一问题.我的问题是,我是否应该使用:
std::begin( myContainer )
Run Code Online (Sandbox Code Playgroud)
要么:
using namespace std; // Better use: "using std::begin"
begin( myContainer )
Run Code Online (Sandbox Code Playgroud)
或者,换句话说,是否可以begin()在std命名空间内重载?我是否应该允许我的函数用户在其他地方重载全局命名空间中的begin()函数?STL如何处理它?
在这个问题(/sf/ask/484850341/)中,user703016使用以下语法来访问vector cards_的迭代器:
对于C++ 98,他们建议使用:cards_.begin()和cards_.end()
对于C++ 11,他们建议使用:std :: begin(cards_)和std :: end(cards_)
对于C++ 14,哪种语法更可取,两者之间是否有任何真正的区别?在今天之前,我只看到了第一种语法.