未知容器的大小

Hum*_*awi 14 c++ coding-style std c++11

我一直在读,使用这段代码并不是那么好:

std::vector<T> my_vector;
...
std::sort(my_vector.begin(), my_vector.end());
Run Code Online (Sandbox Code Playgroud)

最好把它写成:

std::vector<T> my_vector;
...
std::sort(std::begin(my_vector), std::end(my_vector));
Run Code Online (Sandbox Code Playgroud)

因为std :: begin适用于所有容器,包括普通数组.

什么是替代方案my_vector.size()适用于所有容器,包括普通数组?

Die*_*ühl 20

实际使用std::begin(my_vector)正确的事!如果你想拿起你想要使用的自定义点

using std::begin;
using std::end;
std::sort(begin(cont), end(cont));
Run Code Online (Sandbox Code Playgroud)

这种方法试图找到begin(cont)使用ADL,并且,当找不到合适的versio时,回退使用std::begin.

遗憾的是,没有std::size像自定义点那样的默认值std::begin.它可以使用std::distance():

std::distance(begin(cont), end(cont));
Run Code Online (Sandbox Code Playgroud)

但是,对于典型的基于节点的容器,或者更一般地说,对于非随机访问迭代器,此方法将遍历元素而不是从存储的值获取大小.因此,我认为你想打电话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;
    }
}
Run Code Online (Sandbox Code Playgroud)

正如评论中指出的那样,在C++ 17size()工作文件中增加了一个非成员函数(参见24.3 [iterator.synoposis]中的概要的底部).N4280是提出改变的论文.本文还提出了功能empty(),data()并且还添加了功能.所有这些函数都在声明中<iterator>.

版本添加到C++ 17使用decltype()的上size()构件直接在返回类型.另外它声明函数是constexpr:

template <typename C>
constexpr auto size(C const& c) -> decltype(c.size()) {
    return c.size();
}
Run Code Online (Sandbox Code Playgroud)