未知容器的大小
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();
}
相关文章:
- 继承期间显示未知行为的子类
- 输入中的字符串数未知(以字母表示)
- 具有未知值时的时间复杂性
- 链表中写入访问冲突的未知原因
- 正在生成未知类实例
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 读取文件时运行时的未知行为
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 初始化多个未知基类
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何存储未知次数迭代的输入?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 编译 Boost 时在 OS X 上的"ld:未知选项:-soname"
- 未知的 CMake 命令"create_single_source_cgal_program"
- 如何在C++中循环访问未知对象方法?
- Coursera :自动评分器的未知信号 11
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- 未知的 GCC 链接器错误,但已成功构建
- 如何从未知视图中声明范围::v3::View 变量
- std::string.size() 未知行为