关于set<T>::iterator
为只读迭代器的问题。
工作中很少用c++,用set
的时候碰到这么个问题:
1 | pair<set<Dog>::iterator, bool> ret = dog_set.insert( ... ); |
就是想给插入set
失败的Dog
类对象计数,但是编译器告诉我set<Dog>::iterator
是个只读迭代器,不能通过迭代器修改对象:
1 | error: increment of member ‘Dog::counter’ in read-only object |
set
设计的初衷应该是作为单一key
对象的容器,自然是不允许你修改key
,这个场景可能使用map
更合适(使用Dog
作为key
,counter
作为value
)。
但是c++不是可以强制转换吗,定义一个静态类方法:
1 | Dog * Dog::rwIterator(set<Dog>::iterator &it) { |
为什么不能直接
(Dog *)it
呢,因为set<Dog>::iterator
不是指针类型,而是类,解引用操作(*
和->
)只是操作符类方法。所以要通过*
操作符获得Dog
对象的地址然后再强制转换。
然后通过它去修改对象就行了:1
Dog::rwIterator(ret.first)->counter++;
反过来一想,这set
不就成了一个map
吗?只是key
和value
存在于一个类对象中。