c++随笔(set)

关于set<T>::iterator为只读迭代器的问题。

工作中很少用c++,用set的时候碰到这么个问题:

1
2
3
4
5
6
7
8
pair<set<Dog>::iterator, bool> ret = dog_set.insert( ... );

if(ret.second) {
cout << dog_set.size() << ": " << ret.first->toString() << endl;
} else {
/* exist */
ret.first->counter++;
}

就是想给插入set失败的Dog类对象计数,但是编译器告诉我set<Dog>::iterator是个只读迭代器,不能通过迭代器修改对象:

1
error: increment of member ‘Dog::counter’ in read-only object

set设计的初衷应该是作为单一key对象的容器,自然是不允许你修改key,这个场景可能使用map更合适(使用Dog作为keycounter作为value)。

但是c++不是可以强制转换吗,定义一个静态类方法:

1
2
3
Dog * Dog::rwIterator(set<Dog>::iterator &it) {
return (Dog *)&(*it);
}

为什么不能直接(Dog *)it呢,因为set<Dog>::iterator不是指针类型,而是类,解引用操作(*->)只是操作符类方法。所以要通过*操作符获得Dog对象的地址然后再强制转换。

然后通过它去修改对象就行了:

1
Dog::rwIterator(ret.first)->counter++;

反过来一想,这set不就成了一个map吗?只是keyvalue存在于一个类对象中。

-------------本文结束感谢您的阅读-------------