如何从unordered_set获取"last"元素?



我的问题与这个问题略有不同。

有一个带有两个元素的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 <algorithm>,几乎与双介质解决方案相同。

好吧,如果您确定它具有两个元素,请亲吻:

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

unordered_set迭代器是前向术语,定义了operator++并执行您的期望。另一方面,没有办法向后走,只有双向学位者可以。这就是为什么没有unordered_set::rbegin()

还有其他"优雅"的方法吗?

是,这种更明显的实现方式相同的方法:

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

最新更新