如何在C ++中获取集合中元素的引用?

时间:2012-03-05 23:16:45

标签: c++ reference set element

我定义了一个班级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))时它也不起作用。

2 个答案:

答案 0 :(得分:3)

你可以返回一个const引用,并设置用于设置等级const的方法,并声明你必须改变的成员变量是可变的......但这可能不是一个好主意。可变成员实际上是为那些在逻辑上不属于这些类的东西而设计的。&#39;。

你最好不要使用std :: set。集合是一个特殊用途的容器,它使用非常狭窄的用途做出某些保证。 Here's一篇文章讨论std :: set的优点,并概述了在你决定使用之前应该保留的四个条件:

  • 该集合可能会变得如此之大,以至于O(N)和O(log N)之间的差异很重要。
  • 查找次数与插入次数的数量级相同;插入速度与插入速度无关,因此插入速度不高。
  • 元素以随机顺序插入,而不是按顺序插入。
  • 插入和查找是交错的;我们没有明确的插入和查找阶段。

所有这些条件成立时,std :: set可能是一个不错的选择。否则,您可能最好使用向量(可能包含在提供类似集合的接口的类中)。

答案 1 :(得分:1)

std::set 的内部工作要求一旦将元素插入集合中,就不会修改该元素。如果你试图修改它,那么内部结构会不一致,并且会发生坏事

如果您的数据元素可以分为两部分,一部分具有不会更改的密钥而另一部分将更改,则对这两部分使用std::pair<const key,data>并将它们放入{{1 }}