c++ - STL 重载 vector 赋值

标签 c++ vector operator-overloading

我正在开发一个重载索引运算符 ([]) 的类。为了允许对元素进行赋值,运算符有必要返回对该元素的引用。例如:

class myclass: public vector<int>
{
...
public:
    int & myclass::operator [] (int i)
    {
        return vector<int>::operator[](i);
    }
...

在这种情况下,客户端代码可以使用返回的引用来为元素赋值。但是,我希望有一种方法可以拦截元素的实际赋值,这样我就可以使用赋值来进行一些内部管理。有没有一种相对干净和简单的方法来做到这一点,或者我应该只创建一些访问函数而不是使用运算符重载?

最佳答案

据我所知,std::vector 索引运算符已经返回对项目的引用(const 或非常量),因此无需继承和覆盖。

如果你想拦截值的赋值,正确的做法是定义/覆盖值本身的赋值运算符(你不能在 vector 索引运算符中这样做)。这当然不适用于纯 int,因此您需要将 int 包装在一个类中,该类将提供赋值运算符,您可以在那里做“任何你想做的事”。

编辑:

好的,我明白了,那么可能需要做一些覆盖。对于反向查找,一种可能性是不将值存储在反向结构中,而是指向它(指向原始位置)的指针。原始结构中的值分配将通过指针重定向反射(reflect)出来。这还需要将自定义比较运算符传递给反向查找映射,以便不比较指针,而是比较值。

一般来说,可能还值得检查 boost::multi_index ,它允许做到这一点 - 创建一个具有多个查找索引的结构。

关于c++ - STL 重载 vector 赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38707559/

相关文章:

c++ - #pragma 一次位置 : before or after #include's

c++ - 检测负数

c++ - 什么是复制省略和返回值优化?

c++ - std::vector 构造函数中的 bad_alloc

c++ - 如何在 C++ Gtest 中测试输入和输出重载运算符

vb.net - 为什么赋值运算符在 VB.NET 中不可重载?

c++ - 使用 "this"的成员函数的返回值

c++11 - 向量初始化的C++ 11向量

arrays - 获取Scheme中向量的第一个元素

c++ - 在 C++ 中使用深拷贝的运算符重载