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

hli*_*117 8 c++ python set unordered-set

C++是否具有与python相同的功能set.pop()?我一直在寻找的文件unordered_set小号 在这里,但似乎没有成为一个办法1.访问任意元素,和/或2.访问+删除任意元素(膨化).

use*_*267 9

你可以弹出第一个元素

auto i = *set.begin();
set.erase(set.begin());
Run Code Online (Sandbox Code Playgroud)

或者如果你过分担心实现定义的桶内部排序(提示:你可能不应该这样),你可以删除一个随机元素

#include <unordered_set>
#include <iostream>
#include <random>

int main()
{
  std::unordered_set<int> set{0, 1, 2, 3, 4, 5};
  std::default_random_engine ran{std::random_device{}()};

  auto it = set.begin();
  std::advance(it, std::uniform_int_distribution<>{0, set.size() - 1}(ran));

  std::cout << *it << '\n';
  set.erase(it);
}
Run Code Online (Sandbox Code Playgroud)

然而,上面的效率并不是特别高效,你可以通过填写a 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();
  }
}
Run Code Online (Sandbox Code Playgroud)

(nb取决于您的平台random_device可能不是一个非常好的种子).


小智 5

需要注意的是C ++标准库是故意设计成各种容器规格不包括“获取和删除”的功能:例如,对于vector,你back()这末返回值,你有pop_back()哪些在最后删除的价值,但不会返回。

原因很可能是一个单独问题的内容。

因此,您真正想要的是一种获取元素的方法(例如,begin()如注释中所建议),然后在获得元素后将其删除(例如,erase(iterator)如其他答案中所述)。

  • 标准是否提及了该意图的原因? (2认同)