hli*_*117 8 c++ python set unordered-set
C++是否具有与python相同的功能set.pop()?我一直在寻找的文件unordered_set小号 在这里,但似乎没有成为一个办法1.访问任意元素,和/或2.访问+删除任意元素(膨化).
你可以弹出第一个元素
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)如其他答案中所述)。
| 归档时间: |
|
| 查看次数: |
3153 次 |
| 最近记录: |