如何获得" last"来自unordered_set的元素?

时间:2018-02-16 16:18:35

标签: c++ pointers stl

我的问题与此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()的迭代器并将其推进一个。还有更多&#34;优雅&#34;这样做的方法?

-------------------------------------溶液--------- ---------------------------------

受到@YSC的启发,实现目的的elegant方法是:

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

,可能依赖于#include <algorithm>,与双迭代器解决方案几乎相同。

2 个答案:

答案 0 :(得分:0)

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

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

unordered_set迭代器ForwardIteratoroperator++已定义并执行您期望的操作。另一方面,没有办法向后退,只有BidirectionalIterator可以。这就是为什么没有unordered_set::rbegin()

答案 1 :(得分:0)

  

还有更“优雅”的方法吗?

是的,这是实现相同匹配的更明显的方法:

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