gpt4 book ai didi

c++ - 未知容器大小

转载 作者:IT老高 更新时间:2023-10-28 22:36:44 26 4
gpt4 key购买 nike

我一直在阅读,使用此代码不太好:

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

这种方法试图找到 begin(cont)使用 ADL,当找不到合适的版本时,回退到使用 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;
}
}

正如评论中指出的,非成员(member) size()函数已添加到 working paper for C++17 (参见 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();
}

关于c++ - 未知容器大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33329031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com