2014-04-07 6 views
3

지도의 키가 식별자이고 기호가 반환하는 벡터가 유형과 범위를 나타내는 문자열 쌍을 각각 포함하는 기호 테이블을 만들려고합니다. 문자열 키를 가진 맵을 얻으려면 작업 할 단일 문자열의 벡터를 반환 할 수 있지만 쌍을 시도 할 때 오류가 발생합니다.C++에서 <string, vector <pair :: <string, string >>> 맵에 삽입하려면 어떻게해야합니까?

#include <iostream> 
#include <utility> 
#include <vector> 
#include <map> 
#include <string> 
using namespace std; //using std namespace for readibility for this question 

int main() { 
    string key = "myKey"; 
    string string1 = "string1"; 
    string string2 = "string2"; 
    pair <string, string> stringPair = make_pair (string1, string2); 

    map<string, vector<std::pair <string, string>>> myMap; 
    myMap.insert(make_pair (key, make_pair (string1, string2))); //insert key into map, create empty vector 
            //this is where I get th error 

    myMap[key].push_back(std::make_pair (string1, string2)); //use key, push strings into vector<string, string> 

    return 0; 
} 

error C2664: 'std::pair<_Ty1,_Ty2> std::_Tree<_Traits>::insert(std::pair<const _Kty,_Ty> &&)' : cannot convert parameter 1 from 'std::pair<_Ty1,_Ty2>' to 'std::pair<_Ty1,_Ty2> &&'

내가 작업 한 문자열의 벡터를 얻을 수 있지만,이 식별자의 각 인스턴스에 대해 진정한 쌍을 것보다 해결의 더처럼 보인다. 어떤 도움을 주셔서 감사합니다!

답변

4

문제는 쌍의 벡터 대신지도에 쌍을 삽입하려고한다는 것입니다. 여기

map<string, vector<std::pair <string, string>>> myMap; 
myMap[key].push_back(std::make_pair (string1, string2)); //use key, push strings into vector<string, string> 
+0

오, 내 오류가 지금 보입니다. 하지만지도에 키를 넣으려면 명시 적으로 삽입해야합니다. – Johnny

+0

아니요,'map :: operator []'는 키가 이전에지도에 없으면 기본값을 만들고 삽입합니다. 'vector :: vector()'(기본 ctor)는 빈 벡터를 제공하므로 정확히 원하는 것입니다. –

+0

그래, 그게 효과가있어. 마지막 질문에, 당신이 원한다면. 벡터 쌍의 멤버에 어떻게 액세스합니까? 'it-> first'는 키를 가리 킵니다. 그러나'it-> second.first'는 작동하지 않습니다. – Johnny

3

: 당신은 벡터가 비어 시작하려면, 가장 쉬운 방법은 (벡터를 들어, 빈 벡터를 만드는) 기본 생성자를 사용하자, 명시 적으로 모든지도에 삽입하지 않는 것입니다 작동하지만, 나중에 읽기 어려울 수 있습니다 매우 간단한 C++ 11 버전이, 사람에 따라 다릅니다

#include <iostream> 
#include <utility> 
#include <vector> 
#include <map> 
#include <string> 
using namespace std; //using std namespace for readibility for this question 

int main() { 
    string key = "myKey"; 
    string string1 = "string1"; 
    string string2 = "string2"; 
    map<string, vector<std::pair <string, string>>> myMap; 

    myMap.insert({ key, {{ string1, string2 }} }); 

    return 0; 
} 

이 테스트 : http://coliru.stacked-crooked.com/이 (GCC4.8) 물론

당신이 원하는 경우 문자열을 포함하는 벡터에 추가하려면 먼저 i를 확인해야합니다. f 벡터가 이미 존재합니다. 여기서 벡터가 이미 존재하는지 확인하지 않을 것입니다. 그렇다면 벡터가 존재하지 않을 것입니다.

관련 문제