我定义了一个班级Movie
。那个班有一个
static set<Movie> movies;
我还有一个静态成员函数:
static Movie& find_by_title(string);
我正在返回一个引用,因为我想在找到它后修改它(我想给它评分)。所以,在实施中我有
Movie& Movie::find_by_title(string title) {
set<Movie>::iterator it;
for (it = movies.begin(); it != movies.end(); ++it)
if (it->title == title) return *it;
}
但它返回错误,因为*it
的类型为const Movie
(函数返回Movie&
)。但那么如何以一种我可以改变它的方式获得该元素呢?指针也可以,任何可以在之后更改元素的东西。
movies.find(*it)
也会返回const Movie
的迭代器,因此当我尝试返回*(movies.find(*it))
时它也不起作用。
答案 0 :(得分:3)
你可以返回一个const引用,并设置用于设置等级const的方法,并声明你必须改变的成员变量是可变的......但这可能不是一个好主意。可变成员实际上是为那些在逻辑上不属于这些类的东西而设计的。&#39;。
你最好不要使用std :: set。集合是一个特殊用途的容器,它使用非常狭窄的用途做出某些保证。 Here's一篇文章讨论std :: set的优点,并概述了在你决定使用之前应该保留的四个条件:
当所有这些条件成立时,std :: set可能是一个不错的选择。否则,您可能最好使用向量(可能包含在提供类似集合的接口的类中)。
答案 1 :(得分:1)
std::set
的内部工作要求一旦将元素插入集合中,就不会修改该元素。如果你试图修改它,那么内部结构会不一致,并且会发生坏事。
如果您的数据元素可以分为两部分,一部分具有不会更改的密钥而另一部分将更改,则对这两部分使用std::pair<const key,data>
并将它们放入{{1 }}