散列图以查找添加到给定总和的对

时间:2015-06-07 22:38:29

标签: c++ arrays hash

我正在尝试学习如何在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 */
}

2 个答案:

答案 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;
    }
}