1

Rabin Karp とバイナリ検索を使用して、Longest Common Substring プログラムを作成しようとしていました。そのために、基本的に文字列の 1 つに対してハッシュ テーブルを作成するメソッドを作成しました。キーは、インデックス i から始まる長さ M のパターンのハッシュ値になります。They キーの値はインデックス i になります。

私は次のコードを書きました:

#include <iostream>
#include <string>
#include<map>
#include<math.h>
#define BASE 10
#define BASE2 10.0
#define M 99999989
using namespace std;
map<int, int> hashmap;
 int pHash=0;
 int mod(int a, int b) {
    return (a%b + b)%b;
}
 int getHash(string & pattern) {
     int hashVal = 0;
    for ( int i =0 ; i<pattern.length();i++) {
            int val = (int) pattern[i];
            hashVal = mod(hashVal*BASE + val, M);

    }

    return hashVal;
}
int rabinKarp(string &pattern, string & text)
{
     pHash = getHash(pattern);  
     cout<<"P HASH  : "<<pHash<<endl;
     int m = pattern.size();
     int fHash = getHash(text.substr(0, pattern.size()));
    int  newKey = fHash;
     hashmap.insert(newKey, 0);
     if(fHash==pHash)
            cout<<"Rabin Karp found a match at index : 0 "<< endl;


     for(int i = 1; i <=text.size()-pattern.size();i++) {
        int val = (int)text[i-1];
        double sz = (double)pattern.size()-1.0;
        int temp = pow(BASE2, sz);
        int mult= mod(temp,M);
        fHash = mod(fHash - mod(val*mult,M),M);
        fHash= mod(fHash*BASE, M);
        fHash= mod(fHash+(int)text[i+m-1], M);
        int key = fHash ;
        hashmap.insert(key, i);
        if(fHash==pHash)
            cout<<"Rabin Karp found a match at index : "<< i<<endl;
    }
    return 1;

}
int main() {
    string pattern;
    string text;
    cout<<"Please enter the pattern "<<endl;
    getline(cin, pattern) ;
    cout<<"Please enter the text " <<endl;
    getline(cin, text);
    int index = rabinKarp(pattern, text) ;

}

問題は、マップにキーを挿入できないことです。次のエラーが表示されますが、意味がわかりません。誰でもこれが何であるかを理解するのを手伝ってくれますか?

エラー 3 エラー C2664: 'std::pair<_Ty1,_Ty2> std::_Tree<_Traits>::insert(const std::pair<_Kty,_Ty> &)': パラメーター 1 を 'int' から ' に変換できませんconst std::pair<_Ty1,_Ty2> &' c:\program files\microsoft ビジュアル スタジオ 9.0\vc\include\xtree 760 SPOJ

エラー 2 エラー C2100: 不正なインダイレクション c:\program files\microsoft ビジュアル スタジオ 9.0\vc\include\xtree 760 SPOJ

4

3 に答える 3

6

キーと値のペアを挿入しようとしている場合は、 を挿入する必要がありますstd::pair<K, V>。ここで、KVはそれぞれキーと値の型です。std::map:insertを参照してください。次のようなものが必要です

hashmap.insert(std::make_pair(newKey, 0));

特定のキーに値を挿入したいが、既存の値を上書きする可能性を気にしない場合は、次を使用できますoperator[]

hashmap[newKey] = someValue;
于 2012-10-09T11:28:14.993 に答える
2

C++11 以降、 も使用できますemplace(key, value)。これは、指定された引数を使用して を構築し、pairに挿入しmapます。

hashmap.emplace(newKey, 0);
于 2016-06-15T00:20:07.777 に答える
1

あなたは電話するべきです

 result = hashmap.insert(map<int, int>::value_type (newKey, 0)); 
 // or
 result = hashmap.insert(std::make_pair(newKey, 0));

insert als0 戻り値std::pair<iterator, bool>-result.second要素が正常に挿入されたかどうかを確認できます (たとえば、同じキーを持つ要素があった場合、要素は挿入されず、false が返されます。

于 2012-10-09T11:30:54.567 に答える