【问题标题】:How to get a reference of an element in a set in C++?如何在 C++ 中获取集合中元素的引用?
【发布时间】:2012-03-05 23:16:44
【问题描述】:

我定义了一个类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&amp;)。但是然后如何以我可以更改的方式获取该元素?指针也可以,任何可以在之后更改元素的东西。

movies.find(*it) 也将一个迭代器返回到 const Movie,因此当我尝试返回 *(movies.find(*it)) 时它也不起作用。

【问题讨论】:

  • 您不能合法地获得对 std::set&lt;&gt; 元素的非常量引用。
  • 我希望你不打算在这个元素存储在std::set之后再改变它
  • 是的,我打算改变它。我希望那个集合像一个数据库(当然只是一个临时的)。我尝试通过写入和读取磁盘上的文件来实现“数据库”,但是在 C++ 中文件对我来说太复杂了,所以我选择了这种方法。
  • 这为我清除了一切,谢谢。将其发布为答案,以便我接受。

标签: c++ reference set element


【解决方案1】:

您可以返回一个 const 引用,并设置设置 rating const 的方法,并声明您必须更改为可变的成员变量......但这可能不是一个好主意。可变成员实际上适用于逻辑上不属于类“值”的事物。

最好不要使用 std::set。 Sets 是一种特殊用途的容器,它可以在非常狭窄的用途中做出某些保证。 Here's 一篇讨论 std::set 有什么好处的文章,它概述了在您决定使用一个之前应该满足的四个条件:

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

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

【讨论】:

  • 我写了一个类,它用地图的接口包装了一个矢量。原来地图更快。鉴于此,我无法想象 任何 原因会想要一个用类似集合的接口包装的向量。为其他所有内容 +1。
  • @MooingDuck 我们已经讨论了地图与矢量速度的关系before。速度很大程度上取决于几个因素。地图不是更快。我认为将 std::vector 视为“默认”容器类型是合理的,并且仅在有充分理由时才使用另一个容器,例如上述四个条件成立,或者如果一组不同的条件成立:小输入大小和/或性能无关,vector 的界面很不适合但不值得调整。
【解决方案2】:

std::set 的内部工作原理要求元素一旦被插入到集合中就不能被修改。如果你试图修改它,内部结构会不一致,会发生不好的事情

如果您的数据元素可以分成两部分,一个有一个不会更改的键,另一个是您将要更改的,请为这两个部分使用 std::pair&lt;const key,data&gt; 并将它们放入 std::map

【讨论】:

    猜你喜欢
    • 2019-05-08
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2011-06-16
    • 1970-01-01
    • 2020-11-12
    • 2021-04-15
    相关资源
    最近更新 更多