2012-01-08 2 views
0

벡터 찾기 기능은 부분 문자열을 제공하여 시도하고 찾은 경우에도 삽입 된 값을 검색 할 수 있습니다. 지도의 키의 경우에도 마찬가지입니까?벡터 및지도의 키에서 찾기 기능

int main() 
    { 
    vector<string> v; 
    v.push_back("text"); 
    v.push_back("[[text"); 
    v.push_back("text"); 

    for (unsigned i = 0; i < v.size(); i++) 
    { 
     if (v[i].find("[[") == 0) 
     { 
     v[i].append("]]"); 
     } 
    } 
    } 

"[[텍스트]를 찾아"[[텍스트]] "로 만듭니다.

지도에서 시도했지만 런타임에 코드가 충돌합니다. 나는 데브 C++

int main() 
{ 
     std::multimap<string, string> m; 
     std::multimap<string, string> intersection; 
     std::multimap<string, string>::iterator it8; 

     m.insert(pair< string, string>("4-2"," 61-7")); 
     m.insert(pair< string, string>("5-2"," 61-7")); 

    multimap<string, string>::iterator it4; 
    multimap<string, string>::iterator it5; 
    for (it4 = m.begin(); it4 !=m.end(); it4++) 
    { 
     if (m.find("5-") == 0) 
     it5=it4;  
    } 
    cout << " result of 5 search is" << (*it5).first << ", " << (*it5).second <<endl; 
    m.clear(); 
    getchar(); 

} 
+2

"벡터 찾기 기능"을 절대로 사용하지 않고 실제로 그러한 기능이 없습니다. –

+0

@KerrekSB 좋습니다 이것은 Strung 찾기 기능이나 다른 것입니다. 그러나 키와 값이 문자열로있는 맵에서 시도하고 실행하면 부분 문자열에 대한 결과를 가져 오지 않을 것입니다. "[["가 전달되었습니다 . 그러나 우리가지도로서 핵심 가치 개념이 아닌 단지 열쇠를 가지고있는 곳에서 이것이 발견 될 것인가? – Invictus

+0

Wilx의 답을 참조하십시오 : 세트와 맵은 불변의 키를 가지고 있습니다. 그래서 당신은 그들에게'const 문자열 '만 얻을 수 있습니다. 'find '는 여전히 작동하지만'append'는 작동하지 않습니다. –

답변

2

(ideone에 샘플 올바른 코드)

오류는이 라인

if (m.find("5-") == 0) 

가 성공하지 못할 것입니다. 당신은 아마 이것에 놀랄 것입니다. m.find("5-")은 키가 이고 정확히이 "5"인 항목을 찾기 위해 전체지도를 검색합니다. 당신의 열쇠는 "4-2"와 "5-2"입니다.

부분 문자열 "5-"이 포함되어 있습니까?

다른 사람들이 지적했듯이
multimap<string, string>::iterator it4; 
for (it4 = m.begin(); it4 !=m.end(); it4++) 
{ 
    if (it4->first.find("5-") != string :: pos) 
      cout << " result of 5 search is" << it4->first << ", " << it4->second <<endl;  
} 

, 당신은 vector 또는 map의하여 find 방법 하지 관심이 : 그럼 당신은 당신이 루프를 같이 할 생각

it4->first.find("5-"); // check if the key string at this entry contains "5-" 

뭔가를해야합니다. 의 찾기 방법에 관심이 있습니다. 이는 매우 다릅니다. 귀하의 질문의 제목은 약간의 오해의 소지가 있습니다 (실수로).

+0

멋진 설명 주셔서 감사합니다.그것은 반복자를 놓친지도 어떻게 그것없이지도에서 검색을 시작했는지 내 부분에 커다란 실수였다. – Invictus

2

std::set<>의 문제는 당신이 그것을 가지고 주문 침해 할 수 있기 때문에이 자리에 요소를 수정할 수 있다는 것입니다을 사용하고 있습니다. 그러나 이터레이터 (operator[] 대신)를 사용하여 set.begin()에서 set.end()까지 반복하고 수정 된 요소를 제거했다가 다시 삽입 할 수 있습니다.

+0

제안 해 주셔서 감사합니다. 하지만 내 요소의 부분 문자열을 전달하는 경우 벡터의 경우처럼 집합에서 찾을 수 있습니다. 이 경우 해당 반복자를 저장하고 지우거나 지울 작업을 수행 할 수 있습니다. – Invictus

+0

이와 비슷한 내용을 (it4 = m.begin(); it4! = m.end(); it4 ++) { if (m.find ("5") == 0) it5 = it4; } – Invictus

+0

의견이 있습니까? – Invictus