在Bjarne Stroustrup的原理与实践书中,第20章进行了一项练习,要求在矢量和列表中按顺序插入随机值(Jhon Bentley建议的实验)
这是我的代码(如果有更好的方式这样做抱歉)
#include <vector>
#include <list>
#include <iostream>
#include <ctime>
#include <random>
#include <chrono>
using namespace std;
template<typename Iter, typename T>
int find_index(Iter start, Iter end, const T& value)
{
int index = 0;
while (start != end)
{
while (start!=end && value >= *start)
{
++index;
++start;
}
return index;
}
return -1;
}
template<typename Iter>
void print(Iter first,Iter end)
{
while (first != end)
{
cout << *first << endl;
first++;
}
}
int generate_random(int min, int max)
{
random_device device;
mt19937 generator{ device() };
uniform_int_distribution<int> d{ min,max };
return d(generator);
}
int main()
{
int n = 1000;
vector<int> vec;
list<int> list;
auto start = chrono::system_clock::now();
for (size_t i = 0; i<n; i++)
{
int value = generate_random(1, n);
int index = find_index(vec.begin(), vec.end(), value);
if (index == -1) vec.insert(vec.begin(), value);
else vec.insert(vec.begin() + index, value);
}
auto end = chrono::system_clock::now();
print(vec.begin(), vec.end());
cout << "Time: " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << " milliseconds" << endl;
system("pause");
start = chrono::system_clock::now();
for (size_t i = 0; i < n; i++)
{
int value = generate_random(1, n);
int index = find_index(list.begin(), list.end(), value);
if (index == -1) list.insert(list.begin(), value);
else
{
auto p = list.begin();
for (size_t i = 0; i < index; i++)
{
p++;
}
list.insert(p, value);
}
}
end = chrono::system_clock::now();
print(list.begin(), list.end());
cout << "Time: " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << " milliseconds" << endl;
system("pause");
}
,输出为:
N 1000 5000 10000 100000
vec 250ms 4s 16s my laptop committed suicide
list 600ms 15s 63s my laptop committed suicide
vec比列表快,所以为什么我的书说:&lt;&lt;出于性能原因,
你不会在100000元素的中间使用插入和擦除
向量;该列表(和地图)更好。&gt;&gt;
我是否以错误的方式编写代码?