gpt4 book ai didi

c++ - 为什么 C++ 标准不更改 std::set 以使用 std::less<> 作为其默认模板参数?

转载 作者:行者123 更新时间:2023-12-05 09:05:14 28 4
gpt4 key购买 nike

#include <set>
#include <string>
#include <string_view>

using namespace std::literals;

int main()
{
auto v1 = std::set<std::string, std::less<>>{"abc"s};
v1.contains("abc"s); // ok
v1.contains("abc"sv); // ok

auto v2 = std::set{"abc"s};
v2.contains("abc"s); // ok
v2.contains("abc"sv); // error
}

v1.contains("abc"sv);v1.contains("abc"s); 更有效率, 因为它不需要构造字符串对象。

但是,C++ 标准使用 std::less<T> , 而不是 std::less<> , 作为 std::set的默认模板参数。因此,CTAD(类模板参数推导) 不适用于 std::less<> ,我得写丑std::set<std::string, std::less<>>{"abc"s} , 而不是 std::set{"abc"s} .

为什么 C++ 标准没有改变 std::set使用 std::less<>作为它的默认模板参数?只是为了向后兼容?

最佳答案

std::set<T, std::less<T>> 移动至 std::set<T, std::less<>>如果永远不必转换搜索关键字,可以使关键字查找算法更加高效。

相反,如果在每次调用比较器时都发生转换,而不是在启动算法时在调用者中发生一次,则可能会降低它们的效率。这些转换可能非常昂贵。

特别是如果从搜索键转换为 T是有损的,甚至不能保证两者会产生相同的结果!

由于这些原因,这样的更改不是直接升级,而是重大更改。委员会非常不愿意介绍这些内容。

关于c++ - 为什么 C++ 标准不更改 std::set 以使用 std::less<> 作为其默认模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67456235/

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