0 结论
- 优先选择
const_iterator (一般用于不改变迭代器所指的数据),而非iterator ; - 在最通用的代码中,优先选择非成员版本的begin、end和rbegin,而非成员函数版本。
1 论据
有些容器(如内建数组),或者类似的容器的数据结构会以非成员函数的方式提供begin 和end (还有cbegin 、cend 和rbegin 等),而不是以成员函数的方式提供。
成员函数形式:
std::vector<int> values;
auto it = std::find(values.cbegin(), values.cend(), 1983);
values.insert(it, 1998);
非成员函数版本:
template<typename C, typename V>
void findANdInsert(C& container, const V& targetVal, const V& insertVal){
using std::cbegin;
using std::cend;
auto it = std::find(cbegin(container), cend(container), targetVal);
container.insert(it, insertVal);
}
2 注意事项
在C++11中,仅添加了begin 和end ,没有添加cbegin 、cend 、rbegin 、rend 、crbegin 和crend 。这些问题都在C++14中得到了解决。
在C++11中解决的方法如下,例如cbegin ,
template<class C>
auto cbegin(const C& container)->decltype(std::begin(container)){
return std::begin(container);
}
|