【问题标题】:STL overload vector assignmentSTL 重载向量赋值
【发布时间】:2016-08-01 20:29:04
【问题描述】:

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

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

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

【问题讨论】:

  • 有人会问你为什么要从std::vector继承。
  • 不要从不提供虚拟析构函数的类继承。至少,只要你真的知道自己在做什么!
  • 我使用 std::vector 来简化示例。我的实际课程使用地图。我要实现的是双向映射。我需要一种有效的方法来仅使用值作为查找来获取密钥,而无需使用线性搜索。我计划使用另一个向量/映射来维护反向映射,但我无法捕获分配的值。在这一点上,似乎只使用 getter/setter 比定义一个新类来捕获分配更好。将值包装在类中的另一个问题是它会捕获值而不是索引。

标签: c++ vector operator-overloading


【解决方案1】:

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

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

编辑:

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

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

【讨论】:

  • 为了澄清,我需要做的“管家”是保留一个辅助数据结构,我可以用它来进行反向查找,即有效地从值中检索索引而不诉诸线性搜索。将值赋值包装在一个类中将使我能够访问值但不能访问键,所以这也不起作用。
【解决方案2】:

没有办法截取整数的赋值。但是,您可以改为返回对已重载其赋值运算符的自定义类型的引用。自定义类型可以转换为int,这样就可以当做一个了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    相关资源
    最近更新 更多