我的问题与这个问题略有不同。
有一个带有两个元素的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;