C++ 设计 : Template Function for Random Deletion by Index for list & vector

标签 c++ list vector data-structures

来自 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/

相关文章:

c++ - 嵌套 C++ lambda 函数的 header

arrays - 在 SAS 的 IF 语句中创建和使用列表

c++ - C++中的循环优化技术

r - 如何在R中初始化固定长度的向量

c++ - 使用 C++ 插件从 chrome 浏览器下载并运行 exe

c++ - 功能性 : Term does not evaluate error on functional 1149

c# - 检查字符串中的无效字符?最聪明的方法?

c# - 用于自定义排序列表的 Lambda 表达式

c++ - vector 下标超出范围 - 类构造函数初始化中的二维 vector

c++ - 处理多个客户端的单个 TCP/IP 服务器(在 C++ 中)?