我很难编写一种有效的方法来将大量值插入到列表中,而不使用地图。我目前的代码如下:
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;
};
非常感谢任何帮助。
答案 0 :(得分:0)
你关闭;因为你似乎有一个有序列表,试试这个:
key
基本上,一旦你走过key
之后,插入新条目,或者如果你到了最后,你已经获得了最大的while read
,所以把它推到后面。因此,您可以对列表进行排序。
答案 1 :(得分:0)
使用vector
和list
的简单哈希表。
向量包含一个冲突键列表。智能哈希表将调整其大小并重新散列以最小化冲突。这不是智能哈希表。
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