c++ - 通过迭代器更改类成员

标签 c++ stl iterator constants

我正在学习 C++,但无法解决这个问题:

我有一个简单的A类

class A {
private:
    int ival;
    float fval;

public:
    A(int i = 0, float f = 0.0) : ival(i), fval(f) { }
    ~A(){ }
    void show() const { 
        cout << ival << " : " << fval << "\n";
    }
    void setVal(int i) {
        ival = i;
    }

    //const getters for both ival and fval

    //used for the default "lesser"
    friend bool operator<(const A& val1, const A& val2) {
        return val1.ival < val2.ival ? true : false;;
    }
}

然后我有一个普通的set<A> myset充满了 insert(A(2, 2.2));在一个循环中。

迭代获取所有值不是问题,但我想在此迭代中修改值:

for(set<A>::iterator iter = set3.begin(); iter != set3.end(); iter++) {
    iter->setVal(1);
}

我认为这应该是可行的,就像您在 Java 中的 foreach 循环中那样。编译时我得到 error: passing ‘const A’ as ‘this’ argument of ‘void A::setVal(int)’ discards qualifiers .

查看 STL 集的来源,我看到 begin()只能作为常量方法使用,我认为这可能是问题所在。在 setVal() 上使用 const方法总是得到相同的错误并且没有多大意义,因为我想修改 A 的值.

这是不是改一堆A的错误做法?带有循环的值?

最佳答案

STL 集不允许您更改它存储的值。它通过迭代器返回对象的拷贝(而不是集合中的实际拷贝)来实现这一点。

set 这样做的原因是因为它使用 < 对 set 进行排序,并且它不想在每次取消引用迭代器时重新创建整个树,而它必须这样做,因为它不知道是否你改变了任何改变顺序的东西。

如果您需要更新集合<>,请删除旧值并添加新值。

编辑:刚刚检查了 SGI STL 的源代码,它是这样说的:

 typedef typename _Rep_type::const_iterator iterator;

所以,一个 set::iterator 就是一个 set::const_iterator

关于c++ - 通过迭代器更改类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3467997/

相关文章:

c++ - 为什么 Xcode 4.3.1 在这个 protected 变量上加上红色删除线?

python - 功能无法正常工作

c++ - 将 bpftrace 探针附加到 C++ 函数

c++ - 这是哪个标准容器行为?

ruby - 一次遍历两个数组的 'Ruby way' 是什么

java - 最小生成树抛出 NullPointerException

iterator - 在迭代另一个属性时修改结构的一个属性

c++ - 使用 lambda 通知编译器要定义哪个函数的替代方案

c++ - 二进制搜索排序 vector 中的对象,其中包含一些无意义的条目作为干扰

objective-c - 在 iOS 应用程序中使用 STL