我想实现从一个集合里随机取出一个数值,然后把他删掉

xusir98 2013-08-21 09:37:53
//我想实现从一个集合里随机取出一个数值,然后把他删掉
set<int> mySet;
int i = 0;
for (i=0; i<MAX; i++)
{
mySet.insert(i);
}


int nCount = 0;
int nRand = 0;
for (i=0; i<MAX; i++)
{
nCount = mySet.size();
nRand = rand()%nCount;
//问题卡住,由于底层是map的,所以不能实现很快查找到第N个元素的迭代器
//只能一个一个的迭代器遍历查找
//如果用list的话查找元素慢,删除元素快
//如果用vector的话删除时移动元素慢
}
...全文
498 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-08-21
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
用int数组,qsort、bsearch、memmove
顶多再加malloc和realloc
turing-complete 2013-08-21
  • 打赏
  • 举报
回复
不错的方法。 用 std::swap 不会有性能损失的,当然,你的编译器要足够新才行。
引用 3 楼 ananluowei 的回复:
用vector可以啊。自己用一个变量标识目前实际使用的数据个数。假设是msize 比如删除1个元素,不用真的删除,把这个元素和(msize-1)为下标的元素交换,同时msize-- 增加的时候先判断msize是否超过vector的size,不超过就把数据添加在msize下标处,msize++ 如超过vector,就push,然后msize++ 当然,数据是无序的,有序的不能这么做。
大尾巴猫 2013-08-21
  • 打赏
  • 举报
回复
用vector可以啊。自己用一个变量标识目前实际使用的数据个数。假设是msize 比如删除1个元素,不用真的删除,把这个元素和(msize-1)为下标的元素交换,同时msize-- 增加的时候先判断msize是否超过vector的size,不超过就把数据添加在msize下标处,msize++ 如超过vector,就push,然后msize++ 当然,数据是无序的,有序的不能这么做。
woshinia 2013-08-21
  • 打赏
  • 举报
回复
mySet.find()就行了,set是以2叉树的形式保存的,查找的复杂度是logN。 要更快的话,就用HashMap,不过stl中的hashmap好像性能不高,最好自己能实现一个hash函数。
赵4老师 2013-08-21
  • 打赏
  • 举报
回复
用int数组,qsort、bsearch、memmove

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧