这种无序地图的使用是否有效/正确?

时间:2010-10-06 16:41:00

标签: c++ map

我想学习c / c ++中的映射函数,所以这是一个关于无序映射的基本程序。我使用无序映射,因为我的输入数据没有排序,我读到unordered_map非常有效。这里我有一个数组,我正在创建哈希表并使用lookup函数来查找另一个数组中的元素是否在哈希表中。关于这个实现,我有几个问题:

#include <stdio.h>
#include <unordered_map>
using namespace std;

typedef std::unordered_map<int,int> Mymap; 
int main()
{
int x,z,l=0;
int samplearray[5] = {0,6,4,3,8};
int testarray[10] = {6,3,8,67,78,54,64,74,22,77};

Mymap c1;

for ( x=0;x< sizeof(samplearray)/sizeof(int);x++)
 c1.insert(Mymap::value_type(samplearray[x], x));

for ( z=0;z< sizeof(testarray)/sizeof(int);z++)
 if((c1.find(testarray[z]) != c1.end()) == true)
  l++;

printf("The number of elements equal are : %d\n",l);
printf("the size of samplearray and testarray are : %d\t%d\n",sizeof(samplearray)/sizeof(int),sizeof(testarray)/sizeof(int));
}
  1. 首先,这是一个正确的方法 实施它?我得到了 答案正确,但似乎我使用 太多的for循环。
  2. 对于非常小的数据,这似乎相当不错,但如果我正在处理大小&gt;的文件500MB然后看来,如果我为500MB文件创建一个哈希表,那么哈希表本身的大小将是1000MB的两倍。总是这样吗?
  3. std :: unordered map和boost :: unordered map之间有什么区别?
  4. 最后,一个小请求。我是C / C ++的新手,所以如果你给出一些像使用其他typedef /库的建议,我非常感谢你能用一个小例子或者在我的代码上实现它。感谢

2 个答案:

答案 0 :(得分:4)

你开始走错了路。 map(有序或其他)旨在存储密钥以及某些关联数据。在您的情况下,您只存储一个数字(两次,作为密钥和数据)。对于这种情况,您需要set(再次,有序或其他)而不是地图。

我也至少避免使用第一个for循环,而是使用std::copy代替:

// There are better ways to do this, but it'll work for now:
#define end(array) ((array) + (sizeof(array)/sizeof(array[0]))

std::copy(samplearray, 
          end(samplearray), 
          std::inserter(Myset));

如果需要计算两组之间共有多少项,那么for循环是相当合理的。如果您需要/想要真正了解它们之间的共同项,您可能需要考虑使用std::set_intersection

std::set<int> myset, test_set, common;

std::copy(samplearray, end(samplearray), std::inserter(myset));
std::copy(testarray, end(testarray), std::inserter(test_set));

std::set_intersection(myset.begin(), myset.end(), 
                      test_set.begin(), test_set.end(), 
                      std::inserter(common));

// show the common elements (including a count):
std::cout <<common.size() << " common elements:\t";
std::copy(common.begin(), common.end(), 
          std::ostream_iterator<int>(std::cout, "\t");

请注意,您不需要使用set来使用set_intersection - 您需要的只是一个已排序的项目集合,因此如果您愿意,您可以只对两个数组进行排序,然后直接使用set_intersection。同样,如果您愿意,结果可以放在其他一些集合中(例如,vector)。

答案 1 :(得分:0)

正如Jerry所提到的,如果您只需要知道匹配的数量,就可以使用for循环进行搜索。如果是这种情况,我建议使用unordered_set,因为您不需要对元素进行排序。