为什么我们有 std::string::npos 但没有 std::vector::npos
Why do we have std::string::npos but no std::vector::npos?
我想用 -1 来表示尚未计算的大小:
std::vector<std::size_t> sizes(nResults, -1);
我想知道为什么没有一种更富有表现力的方式:
std::vector<std::size_t> sizes(nResults, std::vector<std::size_t>::npos);
它基本上归结为一个相当简单的事实:std::string
包括搜索功能,这导致需要告诉调用者搜索失败。 std::string::npos
满足了这一要求。
std::vector
本身没有任何搜索功能,因此无需告诉调用方搜索失败。因此,它不需要等效的std::string::npos
。
标准算法确实包括搜索,因此它们确实需要能够告诉调用方搜索失败。它们使用迭代器,而不是直接使用集合,因此它们为此目的使用特殊的迭代器(永远不应取消引用的迭代器(。碰巧的是,std::vector::end()
返回一个适合该目的的迭代器,所以使用了它 - 但这或多或少是偶然的。例如,这将在没有std::vector
任何直接参与的情况下完成。
来自 cpp首选项:
std::size_t 是 sizeof 的结果的无符号整数类型 运算符以及 sizeof 运算符和 alignof 运算符 (自C++11以来(....
。std::size_t 可以存储最大大小 理论上任何类型的对象都可能...
size_t
是无符号的,不能表示 -1。 实际上,如果您要尝试将大小设置为 -1,您实际上会将它们设置为size_t
表示的最大值。
因此,除了指示尚未计算大小的值外,还不应使用 size_t
来表示包含类型可能大小的值,因为可能大小集之外的任何值都不能用 size_t
表示。
您应该使用能够表达您希望表示的所有可能值的其他类型。 这是一种可能性:
struct possibly_computed_size_type
{
size_t size;
bool is_computed;
};
当然,你可能想要一个比这更具表现力的解决方案,但关键是至少possibly_computed_size_type
能够存储我们希望表达的所有可能的值。
一种可能性是使用 optional
类型。 optional
类型可以表示类型的值范围,附加值表示"对象没有值"。 提升库提供了这样的类型。
标准库还提供可选类型作为实验功能。 这是我使用此类型创建的示例:http://ideone.com/4J0yfe
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- std::string::find 总是返回 string::npos 偶数
- 不同大小的 std::string::npos
- std::string::erase() 的定义行为是什么,带有 string::npos
- 为什么我们有 std::string::npos 但没有 std::vector::npos
- C++ std::string::find 总是返回 npos
- std::basic_string::npos在C++11中的声明
- 简单的问题:为什么字符串库函数std::string::find总是返回std::string::npos
- std::字符串.npos有效性
- std::string::npos == -1是否总是为真