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

时间:2014-09-22 00:10:46

标签: python c++ set unordered-set

C ++是否与python的set.pop()等效?我一直在查看unordered_set s here的文档,但似乎没有办法1.访问任意元素,和/或2.访问+删除任意元素(弹出)。

3 个答案:

答案 0 :(得分:9)

你可以弹出第一个元素

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

或者如果你过分担心实施定义的桶的内部排序(提示:你可能不应该),你可以删除一个类似

的随机元素
#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);
}

上述内容并不是特别有效,您可以通过填写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();
  }
}

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

答案 1 :(得分:4)

请注意,C ++标准库是故意设计的,因此各种容器规范不包含&#34; get和remove&#34;功能:例如对于vector,您有back()在结尾处返回值,并且您pop_back()会删除最后的值,但不会返回该值。

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

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

答案 2 :(得分:0)