未知容器的大小

Size of unknown container

本文关键字:未知      更新时间:2023-10-16

我一直在读到使用这段代码不太好:

std::vector<T> my_vector;
...
std::sort(my_vector.begin(), my_vector.end());

最好写成:

std::vector<T> my_vector;
...
std::sort(std::begin(my_vector), std::end(my_vector));

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

适用于所有

容器(包括普通数组(的 my_vector.size() 的替代方案是什么?

实际上使用std::begin(my_vector)并不是正确的事情!如果你想选择你宁愿使用的自定义点

using std::begin;
using std::end;
std::sort(begin(cont), end(cont));

此方法尝试使用 ADL 查找begin(cont),如果找不到合适的 versio,则回退以使用 std::begin

可悲的是,没有std::size是像这样的自定义点的默认值 std::begin .使用std::distance()会有点工作:

std::distance(begin(cont), end(cont));

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

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

添加到 C++17 的版本直接在返回类型中使用size()成员上的decltype()。此外,它还声明了要constexpr的函数:

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