2017-05-01 14 views
-2

현재 Q-learning 알고리즘을 사용하여 에이전트가 보상을받을 수 있도록 C++ 프로그램을 구현하는 방법에 대한 연구를하고 있습니다.C++ 문제 해시 테이블에 배열 저장

내 상태와 동작을 저장하기 위해 Hashtable을 사용하려고합니다. 저는 C++ 프로그래밍에 익숙하지 않습니다 ...

해시 테이블을 사용하여 배열을 저장하는 것과 같습니다. 하지만 난 그것을 저장할 올바른 방법을 찾을 수 없습니다 ... 해시 테이블은 배열의 오류 유형이라고 말했다.

using namespace std; 
int state[2] = {0,0}; 
unordered_map<string, int> hashtable; 
hashtable.emplace("State1", state); 
cout << "the State of State1 is :" << hashtable["State1"] << endl; cin.get(); 
Error C2664 'std::pair<const _Kty,_Ty>::pair(std::pair<const _Kty,_Ty> &&)': cannot convert argument 2 from 'int [2]' to 'const int &' myproject c:\program files (x86)\microsoft visual studio 

14.0 \ VC의 \ 포함 \ xmemory0 737

합니까 C++ 해시는 키와 값으로 배열을 저장 할 수 있습니까? 테이블에 배열을 저장할 방법이 없다면? 어떤 파이썬 사전 기능처럼 ....

고마워!

+2

. 템플릿 매개 변수를 'unordered_map'으로 변경해야합니다. [this] (http://stackoverflow.com/questions/2582529/using-array-as-map-value-cant-see-the-error) 대답을 참조하십시오. –

+0

해시 테이블의 정의에서 ''이 무엇을 의미하는지 궁금한가요? –

+1

일반적인 두 요소 배열보다 'state'를 잘 설명하는 구조를 만드는 것이 가치가 있습니다. 이렇게하면 훨씬 쉽게 키잉 할 수 있습니다. – tadman

답변

2

u를 도울 수있는 unordered_map의 몇 가지 팁이 있습니다.

#include <iostream> 
#include <unordered_map> 
#include <string> 
#include <vector> 
using namespace std; 

int main() { 
    // constructor 
    unordered_map<string, int> hashTable = { 
      {"a", 123}, 
      {"b", 456}, 
      {"c", 789} 
    }; 

    // update 
    hashTable["a"] = 1; 
    // add new entry 
    hashTable["d"] = 2; 
    hashTable.insert({"e", 111}); 
    // Iterate and print keys and values of unordered_map 
    for (const auto& n : hashTable) 
     cout << "Key: " << n.first << "\tValue: " << n.second << endl; 
    // Output values by key 
    cout << "The value of d is :" << hashTable["d"] << endl; 

    // init vector 
    vector<int> states{1,2,3,4,5,6,7}; 
    states.push_back(8); 

    // add vector into unordered_map 
    unordered_map<string, vector<int>> ht; 
    ht["state1"] = states; 
    ht.insert({"c", vector<int>{1,1,1,1}}); 

    cout << "Values which key is 'c' in ht" << endl; 
    for(auto& v : ht["c"]) 
     cout << v << "\t"; 
    cout << endl; 

    /* 
    * put array into unordered_map 
    */ 
    int state1[3] = {0, 1, 2}; 
    int state2[2] = {3, 4}; 
    int state3[4] = {5, 6, 7, 8}; 

    // declare map to store int pointer value 
    unordered_map<string, int*> u_map; 

    // add into unordered_map 
    u_map["a"] = state1; 
    u_map["b"] = state2; 
    u_map.insert({"c", state3}); 

    // update 
    u_map["b"] = state3; 

    // get pointer of array 
    auto s1 = u_map["a"]; 
    int* s2 = u_map["b"]; 

    // accesses val in array 
    cout << "Value of key a is: "<< s2[0] << endl; 

    size_t size = sizeof(s1)/sizeof(s1[0]); 
    for (int i = 0; i <= size ; ++i) { 
     cout << "val " << i << " is: "<< s1[i] << endl; 
    } 
    return 0; 
} 

출력 :

Key: d Value: 2 
Key: b Value: 456 
Key: c Value: 789 
Key: a Value: 1 
The value of d is :2 
Value of key a is: 5 
val 0 is: 0 
val 1 is: 1 
val 2 is: 2 

갱신 :

fix use of class template 'vector' requires template arguments 
update for adding array into map 
+0

미안하지만 클래스 템플릿 "std :: vector"에 대한 오류 인수 목록이 없습니다. –

+0

unordered_map은 정의 된 배열을 지원하고 배열 할 수 없습니까? –

+0

@JunwenXie 나는이 오류를 수정 한 위의 코드를 업데이트합니다. –

0

난 당신이 갖고 싶어이 권리 "unordered_map도 < 문자열, 표준 : : 배열을>"을하지 얻었다 경우 " unordered_map < 문자열, int> ". 그래서 코드는 다음과 같이 보일 것이다 :

#include <iostream> 
#include <unordered_map> 
#include <string> 
using namespace std; 

int main() { 
    unordered_map<string, std::array<int,2>> hashTable = { 
     {"State1", {1,10}}, 
     {"State2", {2,20}}, 
     {"State3", {3,30}}, 
    }; 
    for (const auto& n : hashTable) 
     cout << "Key: " << n.first << "\tValue: {" << n.second[0] << ", "  << n.second[1] << "}" << endl; 
    return 0; 
} 

출력 될 것입니다 : 당신의 int를 유지하는`unordered_map`에 INT의 배열을 갖다 두도록하려고

Key: State3 Value: {3, 30} 
Key: State1 Value: {1, 10} 
Key: State2 Value: {2, 20}