在列表和向量中插入性能排序数据

时间:2016-06-28 09:20:01

标签: c++

在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;
我是否以错误的方式编写代码?

0 个答案:

没有答案