STL过载矢量分配

STL overload vector assignment

本文关键字:分配 STL      更新时间:2023-10-16

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

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

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

AFAIK std::vector索引运算符已经返回对项的引用(const或nonconst),因此不需要继承和重写。

如果要截取值的赋值,正确的方法是定义/覆盖值本身的赋值运算符(不能在矢量索引运算符中执行)。这当然不适用于纯int,因此您需要将int封装在一个类中,该类将提供赋值运算符,在那里您可以执行"任何您想要的操作"。

编辑:

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

一般来说,还应该检查boost::multi_index,它可以做到这一点——创建具有多个查找索引的单个结构。

没有办法拦截整数的赋值。但是,您可以返回对自定义类型的引用,该自定义类型的赋值运算符已重载。自定义类型可以转换为int,这样它就可以作为一个类型使用。

当然,这意味着您不能继承返回对int的引用的std::vector<int>。无论如何都应该避免公开继承std::vector。您类的用户可能会意外地通过std::vector<int>*删除对象,这将具有未定义的行为。