C ++是否与python的set.pop()
等效?我一直在查看unordered_set
s here的文档,但似乎没有办法1.访问任意元素,和/或2.访问+删除任意元素(弹出)。
答案 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)
等价是unordered_set.erase我想。 http://www.cplusplus.com/reference/unordered_set/unordered_set/erase/