在 C++ 中访问 unordered_set 的最后一个元素

Access last element of unordered_set in C++

我用 [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;
   }
}

Access last element of unordered_set in C++

您可以像访问前向列表的最后一个元素一样访问无序关联容器的最后一个元素:迭代元素直到到达它。

这样做的渐近复杂度当然是线性的,这不是通常对无序容器所做的事情。

itr--;

这不起作用,因为无序容器迭代器是前向迭代器。它们不能向后迭代。

I want to access in FIFO order

无序 容器的元素未按 FIFO 顺序存储。这种容器的最后一个元素与插入元素的顺序无关。

例如,您可以使用 std::queue 来获得 FIFO 订单。

如果我对你的问题的理解正确,你可以通过使用两个变量——一个输出容器(这里是 std::queue)和一个助手 std::(unordered_)set[=16= 来只获取原始顺序中的唯一元素]

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 对 reader "this container is meant to be used in FIFO mode" 说,你可能想要也可能不想要。

您可以使用 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>>
  >>;

谢谢大家

我知道 unordered_set 不能以有序的方式工作,因此在队列的帮助下实现了相同的方式。