【发布时间】:2021-02-03 00:56:23
【问题描述】:
我正在尝试从 stl::list 中删除随机位置。因为 List 没有随机访问迭代器,所以我想知道如何做到这一点。
#include <iostream>
#include<vector>
#include <random>
#include <list>
#include <iterator>
int main()
{
std::random_device dev;
std::mt19937 rng(dev());
std::uniform_int_distribution<std::mt19937::result_type> dist6(1,99); // distribution in range [1, 99]
std::list<int> myList;
for(int i = 0; i<100; ++i)
{
myList.push_back(i);
}
auto it = myList.begin();
for(int i =0; i<100/2; ++i) //remove 50 item.
{
//move iterator to begin + randrom number.
//call erase with the iterator (it = myList.erase(it))
}
auto iter = myList.begin();
for(int i = 0; i<100/2; ++i)
{
//move iterator to random position
//insert the value of i to that location. myList.insert(iter,i)
}
【问题讨论】:
-
如果要随机访问,为什么要使用列表?
-
您从列表的开头开始,并在向前迭代时开始计数。如果您已经有一个迭代器并且知道与迭代器匹配的“索引”,您可以增加或减少迭代器以移动迭代器的差异。或者您可以从开头或结尾开始,这取决于哪个更接近新位置。
std::advance可能有用。 -
C++ 的创建者对这个用例进行了实验:isocpp.org/blog/2014/06/stroustrup-lists