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();
}