0

我的列表类正在使用 operator[]。我可以使用这个覆盖类吗?如果有任何原因没有提供 operator[] 的列表,请解释。如果下面的代码有任何错误,请清除它。

template<class _Ty,class _Ax = std::allocator<_Ty>>  class listadv : public  
std::list<_Ty,_Ax>
{
// should declare in top of the class
public:
    _Ty operator[](int index)
{
    std::list<_Ty,_Ax>::iterator iter = this->begin();
    std::advance(iter, index);
    return *iter;
}
};

在标头类中定义。

4

2 回答 2

7

不提供的原因std::list<T>::operator[]是它的复杂度不是 O(1),而是 O(N)。如果您使用的是链表,您应该以不涉及索引访问的方式构建您的算法。

我建议listadv像您在 OP 中提出的那样反对该课程。

于 2013-09-25T08:04:50.270 回答
1

如果您真的想拥有这样的访问权限,请将其实现为模板函数(如get_nth)。

此外,您的operator[]. 您应该始终提供两种变体,一种返回非常量引用的非常量变体,另一种返回常量引用的常量变体。您永远不应该按值返回元素,因为这会使表达式a[i] = 5以一种非常微妙的方式失败(即没有编译器错误)。

我认为这个 C++11 代码应该可以按预期工作:

template <typename Container>
auto get_nth(Container& c, std::size_t n) -> decltype(*c.begin())
{
     auto iter = c.begin();
     std::advance(iter, n);
     return *iter;
}

// ...

std::list<int> l;
// ...
get_nth(l, 3) = 1;
于 2013-09-25T08:14:54.963 回答