【问题标题】:how to access only element of unordered_set in c++? [closed]如何在 C++ 中仅访问 unordered_set 的元素? [关闭]
【发布时间】:2018-07-05 09:18:37
【问题描述】:

例如,

unordered_set<int> s ;
s.insert(100);

我如何从 s 获得价值 100?

来自http://www.cplusplus.com/reference/unordered_set/unordered_set/begin/

请注意,unordered_set 对象不保证将哪个特定元素视为其第一个元素。但是,无论如何,从开始到结束的范围涵盖了容器(或存储桶)中的所有元素,直到失效。

所以s.begin() 不会总是给我 100 的值?

请澄清。

【问题讨论】:

  • 为什么要访问集合中的元素?集合通常用于检查值是否存在。
  • @AndreiM 它是库的一部分,所以我需要访问元素以进行快速破解。
  • 你遍历直到找到它,或者使用unordered_set::find查找
  • @ChrisH ,有时我从 begin() 得到不同的垃圾值。
  • @jpb123 如何使用begin 获得垃圾值?我认为问题在于您没有显示的代码。

标签: c++ c++11 unordered-set


【解决方案1】:

当您只有一个元素 (100) 时,您没有订单问题,因此 *begin(s)100

但是,一旦您在 unordered_set 中有 2 个或更多元素,您就不知道哪个值会是第一个 (*begin(s))。

【讨论】:

  • 当你只有一个元素时,你没有顺序问题,所以 *begin(s) 是 100。总是这样吗?或者有时我们可能会得到随机值?
  • 并非总是如此。另一方面, begin() 将始终返回 100(如果您只有一个元素)。
  • @jpb123 为什么你认为它会返回一个随机值?
  • @jpb123 为什么会期望 random 值?
  • 只有成员的 ordering 没有定义(或随机)。即便如此,它也必须从您插入的成员中进行选择——而您只插入了一个——它不能只是组成一些成员。 注意 这与集合为 empty 并且您调用 begin 的情况不同。那是“未定义的行为”,可以返回任何随机值,或者只是异常。
【解决方案2】:

从你提供的链接中,你会看到 begin() 会给你一个元素。

std::cout << "myset contains:";
for ( auto it = myset.begin(); it != myset.end(); ++it )
    std::cout << " " << *it;
std::cout << std::endl;

output: myset contains: Venus Jupiter Neptune Mercury Earth Uranus Saturn Mars

如您所见,使用 begin() 将为您提供指向集合的第一个元素的迭代器,您可以遍历所有元素。

但是,begin(i) 会在同一个示例中为您提供桶,有些桶可以是空的,有些桶可以包含多个元素。

【讨论】:

  • 将存储哪个桶的第一个元素? s.begin() 会在元素所在的任何桶中获取第一个元素吗?我是 C++ 的新手。
  • begin() 将搜索所有桶,直到找到一个元素。不保证订单。 begin(i) 将提供一种自己进行搜索的方法。
  • @AndreiM 我不知道你最后一段是什么意思。
猜你喜欢
  • 2013-06-05
  • 1970-01-01
  • 2021-09-20
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 2014-09-24
  • 2022-10-24
相关资源
最近更新 更多