我有2个类:Item和Customer,我想在项目集中插入一个项目(项目集在客户中)。 问题是我想改变项目中的计数而我遇到了麻烦,因为迭代器不能使用非const函数,例如setCount ...所以这不会编译:
void Customer::insertItem(Item *newItem)
{
std::set<Item>::iterator it;
if (newItem->getCount() == 0)
{
_items.insert(*newItem);
}
for (it = _items.begin(); it != _items.end(); it++)
{
if (_items.find(*newItem) != _items.end()&&it->getName()==newItem->getName())
{
it->setCount(it->getCount() + 1);
}
}
}
但是如果我把const放在setCount中它也不会编译,因为我无法改变count的值。
有没有人知道该怎么做?
提前致谢
答案 0 :(得分:2)
根据§23.2.4/ 5-6(在N3797中,强调我的),您根本无法在放入const
的对象上调用非set
方法:
(5)对于
set
和multiset
,值类型与密钥类型相同。(6)关联容器的
iterator
属于双向迭代器类别。对于值类型与键类型相同的关联容器,iterator
和const_iterator
都是常量迭代器。
所以当你尝试做的时候:
it->setCount(it->getCount() + 1);
这不起作用,因为对象it
指向的是const
。如果您仍希望将计数内部存储到对象和集合中,则可以使计数成员变量为mutable
,并将setCount()
标记为const
。
更可能的是,您想要的容器类似于std::map<std::string, Item>
,您的逻辑将是:
void Customer::insertItem(const Item& newItem)
{
auto it = _items.find(newItem.getName());
if (it == _items.end()) {
// absent, insert it
it = _items.insert(std::make_pair(newItem.getName(), newItem)).first;
}
// now increment the count
// it->first is a const Key, but it->second is just Value, so it's mutable
it->second.setCount(it->second.getCount() + 1);
}