我试图插入一组课程

时间:2015-01-09 20:38:46

标签: c++ stl compilation set const

我有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的值。

有没有人知道该怎么做?

提前致谢

1 个答案:

答案 0 :(得分:2)

根据§23.2.4/ 5-6(在N3797中,强调我的),您根本无法在放入const的对象上调用非set方法:

  

(5)对于setmultiset,值类型与密钥类型相同。

     

(6)关联容器的iterator属于双向迭代器类别。对于值类型与键类型相同的关联容器, iteratorconst_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);
}