Effective STL 22 Avoid in-place key modification in set and multiset

modification the key in set

Class Employee {
    public:
    ...
    void setTitle(const string& title);
    int idNumber() const;
    ...
};

struct IDNumberLess:
    public binary_function<Employee, Employee, bool> {
    bool operator()(const Employee& lhs, const Employee& rhs) const {
        return lhs.idNuber() < rhs.idNumber();
    }
};

typedef set<Employee, IDNumberLess> EmpIDSet;
EmpIDSet se;
Employee selectedID;
...
EmpIDSet::iterator i = se.find(selectedID);
if (i != se.end()) {
    i->setTitile("Corporate Deity");    // some STL implementations reject 
}                                       // this line because *i is const

Solution ( two ways )
I. Cast
Note: casts are dangerous, and can’ t be used to change the key of map and mulitmap which contains elements of type pair (const K, V)

if (i != se.end()) {
    const_cast<Employee&>(*i).setTitle("Corporate Deity");
}

doesn’t work

if (i != se.end()) {
    static_cast<Employee>(*i).setTitle("Corporate Deity");
}

or

if (i != se.end()) {
    ((Employee)(*i)).setTitle("Corporate Deity");
}

above two are equivalent to this:

if (i != se.end()) {
    Employee tmpCopy(*i);
    tmpCopy.setTitle("Corporate Deity");
} 

II. Erase and insert

if (i != se.end()) {
    Employee e(*i);
    e.setTitle("Corporate Deity");
    se.erase(i++);
    se.insert(i, e);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值