- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 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/
您好,我希望我的下一个输出(在本例中就是字母)在上一个输出之后输出 8 个空格。这适用于第一个字符,但之后的 printf 语句不起作用。它在第一个 printf 语句之后立即打印,我试图将其设置为
我想知道制作 std::list<>::splice 背后的基本原理是什么使引用被拼接到新容器中的子序列的迭代器无效。这对我来说有点不合逻辑,尤其是考虑到标准 std::container::swap
谁能告诉我为什么我应该使用 Azure Function 输出绑定(bind)(例如 SendGrid 或 Twilio)而不是仅仅在我的 C# 函数中显式使用适当的 SDK(例如 Sendgrid
我们在当前项目中使用 React 和 TypeScript,我遇到了以下行为。 import React, { Component } from 'react'; 我将上面的行替换为下面的行,因为它似
我是一名优秀的程序员,十分优秀!