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

问题描述 投票:0回答:1

我创建了一个[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
1个回答
3
投票

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

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

当然,这样做的渐进复杂度是线性的,而且这并不是人们通常会对无序容器做的事情。

itr--;

这样做是行不通的,因为无序容器迭代器是前向迭代器。它们不能向后迭代。

我想以FIFO顺序访问

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

你可以使用 std::queue 例如,有一个FIFO命令。


1
投票

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

0
投票

如果我对你的问题理解正确,你可以通过使用两个变量--一个输出容器(这里是 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模式下使用的",你可能想要,也可能不想要。


0
投票

谢谢大家。

我明白无序集不能以有序的方式工作,因此借助队列实现了同样的工作。

© www.soinside.com 2019 - 2024. All rights reserved.