我想知道我将如何创建一个重载的括号运算符来提供 std::list 中元素的位置。
我类的列表声明如下:
std::list<Stimulation*> configuration;
重载的括号运算符声明是:
std::list<Stimulation*>::operator[](const int);
我认为括号运算符的定义如下:
std::list<Stimulation*>::operator[](const int position)
{
auto i = configuration.begin();
return i + position;
***OR***
std::list<Stimulation*>::iterator i = configuration.begin();
return i + position;
}
我是这个概念的新手,所以如果能以正确的方式提供任何帮助,我将不胜感激。在这种情况下,我需要专门使用一个列表,因为我知道其他容器包括括号运算符作为库的一部分。再次感谢您的耐心等待。
最佳答案
std::list
元素在内存中不连续,这与 std::vector
元素不同,这就是为什么不存在 []
运算符的原因,因为这将是低效的,这不是制作列表的原因。
但是,作为练习,您可以使用 for
循环来实现它。这是我天真的实现,缺少 const
版本,并且在越界时断言失败:
#include <list>
#include <iostream>
#include <cassert>
using namespace std;
class MyList : public list<int>
{
public:
int &operator[](int pos)
{
int count=0;
for (auto &it : *this)
{
if (count==pos) { return it;}
count++;
}
assert(false);
}
};
int main()
{
MyList l;
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_back(4);
cout << l[2] << endl;
return 0;
}
如果元素位于列表末尾 (O(N)
),访问时间会非常糟糕,因为您无法将位置添加到 list::begin()
。
我想你可以“缓存”最后一个请求的偏移量和迭代器,这样如果调用者请求偏移量+1(这在程序中很常见)你可以直接前进而不用从头开始恢复。
注意:刚看到关于std::advance
的评论。那里没有用过(不知道)。
关于c++ - std::list 的重载括号运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40794853/