gpt4 book ai didi

c++ - 是否有任何理由不扩展 std::set 以添加下标运算符?

转载 作者:太空宇宙 更新时间:2023-11-04 14:37:48 25 4
gpt4 key购买 nike

我正在使用 std::set 来存储类的唯一实例。 std::set 没有重载的下标运算符,因此您不能执行例如 set[0]

我找到了一种方法:

auto myClass = *std::next(set.begin(), index);

但是,我发现一遍又一遍地复制该代码是单调的。所以我决定扩展 std::set (class sset) 并在其中重载下标运算符会更方便。

template <class T>

class sset: public std::set<T>
{
public:
T operator[](const uint32_t i) const
{
if(i <= (this->size()-1))
return *std::next(this->begin(), i);
else
throw std::out_of_range("Index is out of range");
}
};

int main()
{
auto myClass = set[0]; //works and no exception thrown

return 0;
}

我实现了预期的行为,但我突然想到标准不包含下标运算符一定是有原因的。当然不仅仅是懒惰。

这样做有什么先见之明的缺点或 future 可能出现的问题吗?

最佳答案

索引永远不应超过对数时间,这是预期的。该索引是(至少)线性时间。那是非常低效的。如果您遍历一组中的所有项目,使用该索引,您将获得二次总时间。这是不这样做的一个很好的理由。


对于显示的代码,请注意

if(i <= (this->size()-1)

不能很好地处理尺寸 0。在这种情况下,您将获得无符号环绕,因此条件为 true。取消引用结束迭代器就是未定义行为。

关于c++ - 是否有任何理由不扩展 std::set 以添加下标运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52241773/

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