为什么我不能在 std::set 中的元素上调用非常量成员函数?

Why can't I call a non-const member function on an element in an std::set?

我有下一个代码:

set<Item> temp_items;
set < Item >::iterator it;
temp_items = user->second.get_items();
for (it = temp_items.begin(); it != temp_items.end(); it++)
{
    if (counter == (choice - 1))
    {
        it->get_count();
    }
}

我尝试调用的项目函数是:

int Item::get_count() { return _count; }

我这里没有任何应该阻止我访问项目对象的 const 类型,但我仍然收到下一条消息:

the object has type qualifiers that are not compatible with the member function

object type is const

我该如何解决?

A set 总是返回 const 的对象。在您的循环中,*it 指的是 const Item。您正在尝试调用不符合 const 条件的成员函数 get_count() - 它只允许在非 const 对象上调用,因此失败。

您可以通过标记您的函数来解决此问题 const:

int get_count() const { return _count; }
               ^^^^^^^

注意:您正在调用一个没有副作用且未使用其 return 类型的函数。这实际上并没有做任何事情。

简而言之:您只能在集合迭代器上调用 const 函数。

解释:

集合在内部按 Item 排序。因此,当您访问一个引用(通过迭代器)时,您不允许做一些改变 Item 的值的事情(这在早期的 c++ 版本中实际上很容易实现)。

当您不小心更改值时会发生什么这不会相应地更改内部 "ordering" 并且即使对象在理论上是 "there" 查找也可能失败。

想象一下你有一组数字

1 2 3 4 5 6 7 8 9

现在您将 9 的值更改为 0(通过引用)

1 2 3 4 5 6 7 8 0

现在,当您查找 0 并且容器具有智能查找时,它会使用二进制搜索并假设 0 在最左侧。这将导致找不到 0。

(:这只是一个简化的例子,不是对集合如何实现的明确解释)

这就是为什么对键的引用是 const 引用以及为什么你只能在这些引用上调用 const 函数(这同样适用于地图上的键)。