【问题标题】:Modifying the value of an object of custom class in unordered_set through the iterator通过迭代器修改unordered_set中自定义类对象的值
【发布时间】:2021-12-31 02:48:23
【问题描述】:

我有一个简单的自定义类,声明如下,并且我已经实现了哈希函数和比较函数。散列函数使用字符串的标准散列,比较器只是检查键是否相等,所以我将跳过它们的定义。

我已经实现了一个包含此类对象的unordered_set(是的,我知道unordered_map,但我们在这里假设我想特别坚持unordered_set)。稍后,在某个时间点,我想修改通过迭代器找到的对象的值(但不是键)。

现在,我有点卡住了,我的问题是: 除了 (1) 我想避免通过const_cast 抛弃常量之外,还有其他方法可以实现这一点,以及 (2) extracting 来自我的无序集合的对象,修改它的值然后将其移回并(3)删除元素并在修改值后将其插入回来?

我在 SO 上看到过类似的问题,但那里的讨论总是关于具有可公开访问值的结构。

代码:

class myClass {
private:  
    string key;
    string val;

public:
    void getKey();
    void getVal();
    void setKey(string key);
    void setVal(string val);

    myClass(string key);  
    myClass(string key, string val);
}

<...>

<hasher's definition>
<comparator's definition

int main() {
    unordered_set<myClass, myClassHasher, myClassComparator> myClassUset;

    <...> 

    string some_val;

    auto it = myClassUset.find(myClass{some_key});
    if (it != myClassUset.end()) {
        it->setVal(some_val);
    };
}

【问题讨论】:

  • 请参阅this question 了解一种方法。
  • @1201ProgramAlarm 我已经检查过了,如果你的班级成员是私人的,mutable 似乎不起作用(或者我错过了一些东西,我还需要以某种方式修改设置器)。

标签: c++ stl unordered-set


【解决方案1】:

阅读此内容后:Does the 'mutable' keyword have any purpose other than allowing the variable to be modified by a const function?,我找到了解决方案。你只需要声明你的 setter const:

void setVal(string val) const

虽然,我仍然不明白为什么声明你的 setter 非常量会产生编译错误。

【讨论】:

  • 我仍然不明白为什么声明你的 setter 非常量会产生编译错误,因为你不能在 const 对象上调用非常量成员函数,并且存储在 unordered_set 中的值(键)是 const(以防止进行会改变排序顺序的更改)。
猜你喜欢
  • 2012-12-08
  • 2012-09-10
  • 2016-07-03
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 2020-08-27
  • 2021-02-15
  • 2013-05-21
相关资源
最近更新 更多