相当于python的集合.pop(C++)的无序集

2024-10-01 13:40:45 发布

您现在位置:Python中文网/ 问答频道 /正文

C++是否有一个与Python的^ {CD1>}等价的?我一直在看unordered_setshere的文档,但似乎没有一种方法可以实现1。访问任意元素,和/或2。访问+移除任意元素(弹出)。在


Tags: 方法文档元素等价cd1unorderedsetshere
3条回答

注意到C++标准库是故意EME>设计的,使得不同的容器规范不包括“get and Delphi”函数:例如对于{{CD1>},您有在结尾返回值的^ {< CD2>},并且您有^ {CD3>},它在末尾移除值,但不返回它。在

原因很可能是另一个问题的内容。在

所以你真正想要的是一个方法来获得一个元素(如注释中所建议的begin()),然后在得到它之后将其删除(如另一个答案中提到的erase(iterator))。在

你可以打开第一个元素

auto i = *set.begin();
set.erase(set.begin());

或者,如果您过于关注bucket的实现定义的内部顺序(提示:您可能不应该这样),您可以删除一个随机元素,其中包含

^{pr2}$

然而,上面的方法并不是特别有效,最好是填充一个std::vector,删除重复项,将顺序随机化,然后只pop_back元素。在

#include <algorithm>
#include <vector>
#include <iostream>
#include <random>

int main()
{
  std::vector<int> vec{0, 1, 2, 3, 3, 4, 5, 5};
  std::sort(vec.begin(), vec.end());
  vec.erase(std::unique(vec.begin(), vec.end()), vec.end());

  std::shuffle(
    vec.begin(), 
    vec.end(), 
    std::default_random_engine{std::random_device{}()}
  );

  while (!vec.empty()) {
    std::cout << vec.back() << '\n';
    vec.pop_back();
  }
}

(注意:取决于您的平台random_device可能不是一个很好的种子)。在

相关问题 更多 >