std :: list的重载括号运算符

一一

我想知道如何创建一个重载的括号运算符,该运算符将在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;
}

我是这个概念的新手,因此以适当的方式来帮助您将不胜感激。在这种情况下,我需要专门使用一个列表,因为我知道其他容器包括方括号运算符作为库的一部分。再次感谢您的耐心和时间。

让·弗朗索瓦·法布尔(Jean-Francois Fabre)

std::liststd::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;
}

如果element在列表(O(N)的末尾,则访问时间非常糟糕,因为您无法在上添加位置list::begin()

我想您可以“缓存”最后一个询问的偏移量和迭代器,因此,如果调用方要求偏移量+1(在程序中很常见),则可以直接进行操作而无需从头开始。

注意:刚刚看到有关的评论std::advance在那里不使用(不知道)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

std :: vector和std :: list的重载运算符

运算符|| 为std :: variant重载

重载std :: tuple的typecast运算符

重载 std::array << 运算符

std::initializer_list 作为重载运算符的右手参数?

如何重载基于范围的std :: list的解除引用运算符?

std :: array中的重载运算符[]

C ++ | 重载运算符<< | std :: map

重载赋值运算符以返回std :: vector

继承自std :: string或运算符重载

具有std :: function参数的重载运算符

重载std :: string小于c ++中的运算符

重载运算符=破坏std :: sort

std ::查找具有重载==运算符的对象的向量

cpp 运算符在 std::function 中重载

无法使用std :: variant重载运算符<<()的流std :: endl

静态vs.成员运算符重载:std :: operator <<和std :: ostream :: operator <<

是否可以将带有一对std:string和std :: vector <int>的std :: map重载<<运算符?

尽管实现了专用的非模板功能,std :: endl不适用于重载的运算符<<

C ++如何在不同返回类型的重载运算符上使用std :: function

为什么在重载的流运算符上std :: basic_string <char> segfaulting?

当重载`std :: ostream`运算符时,是否可以更改默认非类型模板参数?

使用MINGW gcc编译时,不会为std :: string调用重载的new运算符

为什么std :: map重载运算符<不使用Compare

为什么std :: span重载函数调用运算符以进行索引?

std :: vector <ComparisonPair>类型没有可行的重载运算符[]

如何从重载的 Subscripting [] 运算符返回 std::unique_ptr&?

msvc / permissive- std :: string重载运算符'='不明确

std :: cout无法与结构的重载'<<'运算符一起使用