C++ 未知容器的大小
我一直在读到,使用此代码并不太好:C++ 未知容器的大小,c++,c++11,coding-style,std,C++,C++11,Coding Style,Std,我一直在读到,使用此代码并不太好: std::vector<T> my_vector; ... std::sort(my_vector.begin(), my_vector.end()); std::vector my_vector; ... 排序(my_vector.begin(),my_vector.end()); 最好写为: std::vector<T> my_vector; ... std::sort(std::begin(my_vector), std::e
std::vector<T> my_vector;
...
std::sort(my_vector.begin(), my_vector.end());
std::vector my_vector;
...
排序(my_vector.begin(),my_vector.end());
最好写为:
std::vector<T> my_vector;
...
std::sort(std::begin(my_vector), std::end(my_vector));
std::vector my_vector;
...
std::sort(std::begin(my_向量)、std::end(my_向量));
因为std::begin将与包括普通数组在内的所有容器一起工作
除了适用于包括普通数组在内的所有容器的
my\u vector.size()
,还有什么替代方法?实际上使用std::begin(my\u vector)
是不对的!如果您想选择定制点,则最好使用
using std::begin;
using std::end;
std::sort(begin(cont), end(cont));
这种方法尝试使用ADL查找begin(cont)
,当找不到合适的版本时,回退使用std::begin
遗憾的是,像std::begin
这样的定制点没有默认的std::size
。使用std::distance()
:
然而,对于典型的基于节点的容器,或者更一般地,对于非随机访问迭代器,这种方法将遍历元素,而不是从存储值中获取大小。因此,我认为您应该调用cont.size()
。定义一个合适的定制点比较简单:
namespace util {
template <typename C>
typename C::difference_type size(C const& c) {
return c.size();
}
template <typename T, std::size_t N>
std::size_t size(T const(&)[N]) {
return N;
}
}
你可以尝试自己的模板<代码> siz()/Cuff>函数,专门为原始C++样式数组。STD::大小,但是直到C++ +17u将得到一个<代码> STD::大小(MyObjavic)< /C> > C++ 17。现在没有任何.YMMV,但我不再担心支持所有容器类型:您只需要四个容器:
vector
,unordered\u map
,deque
,以及unordered\u set
。其中,只有向量
是一般的工作马,其他的只在特殊情况下有用。最重要的是,您不应该使用列表
或转发列表
,在任何情况下都可以用向量
替换,并且向量
将显著更快。也就是说,超过90%的容器应该是vector
,特殊情况无论如何都是特殊的。它们应该是两个不同的答案,这样我可以投两次赞成票。。谢谢你给我讲清楚了。
namespace util {
template <typename C>
typename C::difference_type size(C const& c) {
return c.size();
}
template <typename T, std::size_t N>
std::size_t size(T const(&)[N]) {
return N;
}
}
template <typename C>
constexpr auto size(C const& c) -> decltype(c.size()) {
return c.size();
}