【问题标题】:How to get the "last" element from an unordered_set?如何从 unordered_set 中获取“最后一个”元素?
【发布时间】:2018-07-27 14:25:29
【问题描述】:

我的问题与one略有不同。

有一个包含两个元素的 unordered_set。我想像这样“同时”操作这两个元素:

unordered_set<vector<bool>> st;
st.insert(vector<bool>(100,true));
st.insert(vector<bool>(100,false));
// vector<bool> temp_v(100,true);
// temp_v[3] = false;
// st.insert(move(temp_v));
if (st.size()!=2) return;
for (int i=0; i<100; i++) 
  cout << (st.begin()->at(i)) ^ (st.rbegin()->at(i)) << endl;

但是,unordered_set 没有成员函数 rbegin()。我知道我可以使用指向u_s::begin() 的迭代器并将其推进一个。有没有更“优雅”的方式来做到这一点?

--------------------------解决方案---------- ----------------------------------

受@YSC启发,一个elegant达到目的的方式是:

auto & e1 = *begin(st);
auto & e2 = *(++begin(st));
for (int i=0; i<100; i++) cout << e1[i] ^ e2[i] << endl;

这可能依赖于#include &lt;algorithm&gt;,与双迭代器解决方案几乎相同。

【问题讨论】:

  • std::unordered_set 仅提供前向迭代器。没有办法向后迭代。考虑到unordered_set 是无序的,即使是最后一个元素的概念也是值得怀疑的。有一个最后一个元素,但一个元素是最后一个这一事实并不重要。
  • 看起来你使用了错误的容器,哪个元素是第一个或第二个?
  • 只是这个unordered_set&lt;vector&lt;int&gt;&gt; st; 无法编译。 Life demonstration。无论如何,一组无序的向量有什么好处?你的用例是什么?对我来说,这看起来像 XY Problem
  • 我不明白您为什么要尝试从 UNORDERED 集合中提取订单。第一的?最后的?开始?结尾?这些话在这里毫无意义。
  • ...您希望您的代码 sn-p 的输出是什么?

标签: c++ pointers stl


【解决方案1】:

好吧,如果你确定它有两个元素,KISS:

struct not_vector { /*...*/ };
unordered_set<not_vector> st;
// ...
not_vector const& first = *begin(st);
not_vector const& last  = *(++begin(st));

unordered_set 迭代器是 ForwardIterator,在其上定义了 operator++ 并执行您期望的操作。另一方面,没有办法倒退,只有BidirectionalIterator可以。这就是为什么没有unordered_set::rbegin()

【讨论】:

  • 我什至无法编译:Life demonstration.
  • std::next 会使代码更加优雅,即*(std::next(begin(st)))
  • @ChristianHackl 无用的代码不能或多或少优雅
  • @ChristianHackl 我不是关于编译,你可以创建适当的哈希,但是 unordered_set 的第一个和第二个元素的整个概念是没有意义的。
  • @user3813057 小心vector&lt;bool&gt;,它不是一个合适的标准容器。
【解决方案2】:

有没有更“优雅”的方式来做到这一点?

是的,这种更明显的方式可以实现相同的匹配:

int values[] { 0, 3 };
int index = random_number_generated_by_compiler_version() % 2;
std::cout << values[index] << values[!index] << std::endl;

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 2020-07-03
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2011-01-12
    • 2020-04-06
    • 2018-11-28
    相关资源
    最近更新 更多