更快捷的方式插入列表?

时间:2016-10-21 03:40:14

标签: c++ list insert

我很难编写一种有效的方法来将大量值插入到列表中,而不使用地图。我目前的代码如下:

list<pair<int, vector<int>>> myList;

void key_value_sequences::insert(int key, int value){
    for(it=myList.begin(); it!=myList.end(); ++it){
        if(it->first==key){
            it->second.push_back(value);
            return;
        }
    }
    vector<int> v;
    v.push_back(value);
    myList.push_back(make_pair(key, v));
    myList.sort();
    return;
};

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

你关闭;因为你似乎有一个有序列表,试试这个:

key

基本上,一旦你走过key之后,插入新条目,或者如果你到了最后,你已经获得了最大的while read,所以把它推到后面。因此,您可以对列表进行排序。

答案 1 :(得分:0)

使用vectorlist的简单哈希表。

向量包含一个冲突键列表。智能哈希表将调整其大小并重新散列以最小化冲突。这不是智能哈希表。

vector用作外部容器,因为它具有更快的迭代速度。内部容器的字符串大小写也是vector,因为list ...除非你添加和删除超过迭代次数,否则它们有点糟糕。 I'll let the big man himself explain.

#include <iostream>
#include <vector>
#include <list>
#include <string>
#include <stdexcept>

class poor_mans_hash
{
    std::vector<std::list<std::pair<int,int>>> hash_table;

    int hash(int val)
    {
        return abs(val%static_cast<int>(hash_table.size()));
        // abs because a negative number makes a very explosive vector index
    }
public:
    poor_mans_hash(int size): hash_table(size)
    {
        // all work done in member initialization list
    }

    void insert(int key,
                int val)
    {
        // get list for correct element
        std::list<std::pair<int,int>> &collisionlist = hash_table[hash(key)];

        // see if key is in list
        for (std::pair<int,int> &test: collisionlist)
        {
            if (key == test.first)
            {
                test.second = val; // update existing
                return;
            }
        }
        // key not found. Add it.
        collisionlist.push_back(std::pair<int,int>(key, val));
    }

    bool find(int key)
    {
        for (std::pair<int,int> &test: hash_table[hash(key)])
        {
            if (key == test.first)
            {
                return true;
            }
        }
        return false;
    }

    int & get(int key)
    {
        for (std::pair<int,int> &test: hash_table[hash(key)])
        {
            if (key == test.first)
            {
                // found key. Return value
                return test.second;
            }
        }

        // Not found. 
        throw std::out_of_range("No such key");
    }
};

int main()
{
    poor_mans_hash test(50);

    test.insert(1, 1);
    std::cout << "1: " << test.get(1) << std::endl;
    try
    {
        std::cout << test.get(51) << std::endl;
    }
    catch (std::out_of_range &e)
    {
        std::cout << "could not get 51: " << e.what() << std::endl;
    }
    test.insert(11, 11);
    test.insert(21, 21);
    test.insert(51, 51);
    std::cout << "1: " << test.get(1) << std::endl;
    std::cout << "51: " << test.get(51) << std::endl;
    test.insert(1, 2);
    std::cout << "1: " << test.get(1) << std::endl;

}

对此的可能改进很多。一方面,重组和更聪明的组织。另一方面,这里有一篇关于你可以做的所有有趣事情的文章,以使它成为一个好的,类似于库的容器Writing your own STL Container