我正在尝试学习如何在C ++中使用哈希映射,并且无法将随机生成的数组放入哈希映射中,其中键和向量的int为值(对于数组中的重复值)。我还没有编写总和,因为我想确保我可以先将数组输入到hashmap中。
当我用显示功能输出哈希图时,我得到了
Total size: 1
Index in H Number
key: 0 values: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
我创建的数组有15个值,范围从1-10,因此有重复,因此需要向量。我不确定我做错了什么,所以欢迎任何形式的指导。
#include <iostream>
#include <time.h>
#include <fstream>
#include <map>
#include <cstdlib>
#include <iomanip>
#include <vector>
void display(std::map <int, std::vector<int> > hash);
int main(){
srand (time(NULL));
int temp;
int tempCount = 1;
int count = 0;
int number;
int k = 10; //sum for pairs in an array
//create array for testing
int size = 15;
int foo[size] = {};
for(int i = 0; i < size; ++i){
foo[i] = ((double)rand() * (10 - 1) / (double)RAND_MAX + 1);
}
//print array:
for(int i = 0; i < size; ++i){
std::cout << foo[i] << std::endl;
}
//Find pairs in an array whose sum is equal to ten using hash map
std::map <int, std::vector<int> > hash;
const std::pair<int, int> pairs[size];
for(int i = 0; i < size; i++){
std::make_pair(pairs[foo[i]] , i);
}
const int N = sizeof(pairs) / sizeof(pairs[0]);
for(int i = 0; i < N; ++i){
const int& key = pairs[i].first;
const int value = pairs[i].second;
hash[key].push_back(value);
}
display(hash);
}
void display (std::map <int, std::vector<int> > hash)
{
std::cout << "\tTotal size: " << hash.size() << std::endl; /* Output the size */
/* Create an iterator, much like vector iterators */
std::map <int, std::vector<int> >::iterator it;
for (it = hash.begin(); it != hash.end(); it++){
/* Output first (which is index) and second (which is the element) */
const int& key = it->first ;
std::cout << "key: " << key << " values: ";
const std::vector<int>& values = it->second ;
for(std::size_t i = 0; i < values.size(); ++i)
std::cout << values[i] << ' ';
std::cout << '\n';
}
std::cout << std::endl; /* Print a new line */
}
答案 0 :(得分:2)
通过更改:
const std::pair<int, int> pairs[size];
for(int i = 0; i < size; i++){
std::make_pair(pairs[foo[i]] , i);
}
要:
std::pair<int, int> pairs[size];
for(int i = 0; i < size; i++){
pairs[i] = std::make_pair(foo[i] , i);
}
应该解决最初的问题。
注意:我删除了const以便修改对值,否则它们都会保留(0,0)。
答案 1 :(得分:1)
当每个键具有唯一值时,将使用STL映射。使用多重映射会更容易,而不是使用向量来保存多个结果。我已修改您的代码以演示其用法。此代码需要c ++ 11,但即使您使用较旧的编译器,仍然可以使用多图。
#include <iostream>
#include <time.h>
#include <map>
#include <cstdlib>
using namespace std;
int main()
{
srand ((unsigned int)time(NULL));
//create array for testing
constexpr int size = 15;
int foo[size];
for (int i = 0; i < size; i++)
{
foo[i] = ((double)rand() * 10 / (double)RAND_MAX + 1);
}
//print array:
for(int i = 0; i < size; ++i)
{
cout << foo[i] << endl;
}
//Find pairs in an array whose sum is equal to ten using hash map
multimap<int, pair<int, int>> sums;
for (int i = 0; i < size; i++)
{
for (int j = i+1; j < size; j++)
{
int sum = foo[i]+foo[j];
sums.insert(make_pair(sum, make_pair(foo[i], foo[j])));
}
}
// Print the pairs that sum to 10.
const auto from = sums.lower_bound(10);
const auto to = sums.upper_bound(10);
for (auto i = from; i != to; i++)
{
cout << i->second.first << " + " << i->second.second << " = " << i->first << endl;
}
}