来自 C。我正在努力设计一个通用函数,它接受一个 vector 或列表,然后通过它的索引随机删除一个元素。 (我正在比较 vector/列表的运行时/性能。)
代码的作用如下:
1. Creates a vector of uniformly distinct randomized values i.e. { 5, 3, 1, 8, 10}
2. Copies these values to a list and vector while maintaining sorted order
randCont = { 5, 3, 1, 8, 10}
cont2 = {} //list or vector
func random_insert( randCont, cont2 )
// Copy randomized elements from randCont to cont2 while maintaining sorted order
// prints container2 at each insert step
5
3 5
1 3 5
1 3 5 8
1 3 5 8 10
3. ** I need a function that accepts ideally vector or list and randomly deletes an element at a given index.
Output: Assume randomly selected indexes = [2 1 2 0 0] and input = {1 3 5 8 10}
1 3 5 8 10 //remove idx 2
1 3 8 10 //remove idx 1 ...
1 8 10
1 8
8
我目前正在执行此代码的删除部分,其中包含用于列表和 vector 的单独函数 + 并使用重复的丑陋代码 [参见下文]。我还使用 std::next() 在列表中按索引获取元素,由于可能的编译器优化,这并不理想。我对 vector 做同样的事情(不必要地),因为我想让两种容器类型的代码保持相似。有没有办法用模板/通用容器函数来做到这一点——请解释一下?
void randomize_vec_delete(vector<int> &myVec)
{
mt19937 generator(SEED);
uniform_int_distribution<int> dist(0, distance(myVec.begin(), myVec.end()) - 1);
int rd = dist(generator);
vector<int>::iterator it = myVec.begin();
while(!myVec.empty())
{
//myVec.erase(myVec.begin() + rd);
it = std::next(myVec.begin(),rd);
myVec.erase(it);
print(myVec);
uniform_int_distribution<int> dist(0, distance(myVec.begin(), myVec.end()) - 1);
rd = dist(generator);
}
}
void randomize_list_delete(list<int> &myList)
{
mt19937 generator(SEED);
uniform_int_distribution<int> dist(0, distance(myList.begin(), myList.end()) - 1);
int rd = dist(generator);
list<int>::iterator it = myList.begin();
while(!myList.empty())
{
it = std::next(myList.begin(),rd);
myList.erase(it);
print(myList);
uniform_int_distribution<int> dist(0, distance(myList.begin(), myList.end()) - 1);
rd = dist(generator);
}
}
最佳答案
是的,您可以很容易地为这个函数制作模板。
template <typename Container>
void randomize_delete(Container &myVec)
{
mt19937 generator(SEED);
uniform_int_distribution<int> dist(0, distance(myVec.begin(), myVec.end()) - 1);
int rd = dist(generator);
typename Container::iterator it = myVec.begin();
while(!myVec.empty())
{
//myVec.erase(myVec.begin() + rd);
it = std::next(myVec.begin(),rd);
myVec.erase(it);
print(myVec);
uniform_int_distribution<int> dist(0, distance(myVec.begin(), myVec.end()) - 1);
rd = dist(generator);
}
}
我们只需将 std::vector/std::list
更改为模板参数即可。
代码是否足够解释?
关于C++ 设计 : Template Function for Random Deletion by Index for list & vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48845182/