如何从向量中随机删除一个元素?
Posted
技术标签:
【中文标题】如何从向量中随机删除一个元素?【英文标题】:How to erase an element randomly from a vector? 【发布时间】:2020-04-06 13:38:15 【问题描述】:我想知道如何随机擦除向量中的元素。例如,我有一个向量,其中包含整数 1,2,3,4,5。我想随机删除其中一个。我该怎么做?
int main()
vector <int> myvec 1,2,3,4,5;
if (!myvec.empty())
myvec.erase(myvec.begin());
cout << myvec.at(0);
cout << myvec.at(1);
cout << myvec.at(2);
cout << myvec.at(3);
else
cout << "Vector is empty" << endl;
以上是我到目前为止的代码。它是一个 if 和 else 语句,用于检查向量是否为空并擦除一个元素。问题是我不确定如何让它删除随机元素。目前它只删除第一个元素。
【问题讨论】:
如果您在此处搜索“[c++] 生成随机数”,您将找到有关如何在某个范围内生成随机值的说明(例如,从0
到 myvec.size()-1
)。生成这样一个值,并将其添加到myvec.begin()
以获得引用myvec
元素的迭代器。
@maany:在学习编程时,有助于将问题分解成更小的部分。你可以删除第二个元素吗?你能写一个函数来接受int i
并删除第 i 个元素吗?之后,您只需要使用随机值调用该函数。
@MSalters 是的,我可以通过在开始后添加 +1 来删除第二个元素
【参考方案1】:
使用随机整数生成器生成一个从(0 到向量大小 -1)的整数,然后对生成的数字使用擦除,如下所示
#include<random>
#include<chrono>
#include<vector>
int main()
std::vector <int> myVec 1,2,3,4,5;
//creat a random engine object and seed it
std::default_random_engine engineObj(std::chrono::system_clock::now().time_since_epoch().count());
//The distribution will be used
std::uniform_int_distribution<size_t> randomInt0ul, myVec.size()-1;
//Erase
myVec.erase(myVec.begin() + randomInt(engineObj));
//Test
for(auto const & el: myVec) std::cout << el << " ";
【讨论】:
【参考方案2】:感谢 cmets。我想通了。
srand((unsigned) time(0));
int randomNumber;
for (int index = 0; index < 1; index++)
randomNumber = (rand() % 5) + 0;
cout << randomNumber << endl;
vector <int> myvec 1,2,3,4,5;
if (!myvec.empty())
myvec.erase(myvec.begin() + randomNumber);
cout << myvec.at(0);
cout << myvec.at(1);
cout << myvec.at(2);
cout << myvec.at(3);
else
cout << "Vector is empty" << endl;
【讨论】:
+ 0
什么都不做,您对rand()
的使用已经过时,但可能适合您的目的【参考方案3】:
你想要rand() function。使用它为您的向量生成一个随机索引。
【讨论】:
自 2011 年起不再推荐。改用#include <random>
(除非你被一些非常旧的编译器困住):https://***.com/questions/19665818/generate-random-numbers-using-c11-random-library以上是关于如何从向量中随机删除一个元素?的主要内容,如果未能解决你的问题,请参考以下文章