我想学习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));
}
最后,一个小请求。我是C / C ++的新手,所以如果你给出一些像使用其他typedef /库的建议,我非常感谢你能用一个小例子或者在我的代码上实现它。感谢
答案 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
,因为您不需要对元素进行排序。