我创建了一个[2,3,5]的unordered_set,我想按FIFO顺序访问,如何用unordered_set来实现,我试过这样做,但得到了编译错误。
int showFirstUnique() {
if(unique.empty())
return -1;
else{
unordered_set<int> :: iterator itr=unique.end();
itr--;
return *itr;
}
}
在C++中访问unordered_set的最后一个元素。
你可以访问无序关联容器的最后一个元素,就像你访问前向列表的最后一个元素一样。通过迭代元素直到你到达它。
当然,这样做的渐进复杂度是线性的,而且这并不是人们通常会对无序容器做的事情。
itr--;
这样做是行不通的,因为无序容器迭代器是前向迭代器。它们不能向后迭代。
我想以FIFO顺序访问
的要素 无序 容器不是按照FIFO顺序存储的。这种容器的最后一个元素与插入元素的顺序无关。
你可以使用 std::queue
例如,有一个FIFO命令。
您可以使用 boost::multi_index
同时拥有无序查找和插入序列。
template<typename T>
using fifo_set = boost::multi_index_container<T,
boost::multi_index::indexed_by<
boost::multi_index::random_access<>,
boost::multi_index::unordered_unique<boost::multi_index::identity<T>>
>>;
如果我对你的问题理解正确,你可以通过使用两个变量--一个输出容器(这里是 std::queue
)和一个助手 std::(unordered_)set
std::vector<int> input {3, 6, 3, 2, 0, 2, 6};
std::queue<int> fifo;
std::unordered_set<int> helper;
for (int i: input) {
auto [_, wasInserted] = helper.insert(i); //C++17
if (wasInserted) {
fifo.push(i);
}
}
while (!fifo.empty()) {
std::cout << fifo.front() << " ";
fifo.pop();
}
//output 3 6 2 0
您可以使用任何其他容器代替 std::queue
- std::vector
也同样有效。std::queue
对读者说:"这个容器是要在FIFO模式下使用的",你可能想要,也可能不想要。
谢谢大家。
我明白无序集不能以有序的方式工作,因此借助队列实现了同样的工作。