2013-06-28 4 views
0

나는가장 좋은 방법

std::map<std::string, std::vector<std::string> > keyTable; 

내가 코드 조각 다음, 구문 분석 한 다음과 같이 문자열로 키와 값을 가진지도 문자열의 벡터입니다했습니다 값 문자열을 찾아서 맵에 저장하십시오. 값은 |로 구분됩니다. 나는 그들을 파싱하고 문자열의 벡터로 맵에 저장해야합니다.

따라서 다음과 같은 코드를 작성했습니다. 속도와 효율성 측면에서 더 나은 해결책이 있습니까?

keyTable.insert(key, std::vector<std::string>()); 
    std::vector<std::string>& valueVect = keyTable[key]; 
    boost::tokenizer tokens(str , "|"); 
    for (boost::tokenizer::iterator tok_iter = tokens.begin() ; tok_iter != tokens.end() ; ++tok_iter) 
    { 
     valueVect.push_back(*tok_iter); 
    } 
+0

을 강화 :: algorithm' 그 무언가를 가지고 복사본이 아니라 각 토큰에 대한 포인터를 제공하지만 이름은 기억하지 못합니다. 또는 컨테이너에 복사하지 않으려면'emplace_back'을 사용할 수 있습니다. –

+0

컴파일러 버전 및 이름? C++ 11 지원? 몇 가지 분명한 개선 사항이 있습니다. – Yakk

+0

Visual C++ - Visual 2010 – user373215

답변

0

내 관점에서 볼 때, 코드에 오버 헤드가 추가되므로 더 나은 해결책은 부스트 ​​라이브러리를 사용하지 않는 것입니다. 다음 코드는 같은 작업을 할 것입니다 : 나는 그것을 얻을 수있는 C++ 03 순수한에서

const char * begin = str.c_str(); 
const char * end = begin + str.length(); 
while (begin < end){ 
    const char *ptr = begin; 
    while (*ptr != '|' && *ptr != '\0') ptr++; 
    valueVect.push_back(string(begin, ptr - begin)); 
    begin = ptr+1; 
} 
0

을,이에 대한 효율적입니다 :`

std::vector<std::string>& valueVect = keyTable[key]; 
std::string::const_iterator b = str.begin(); 
std::string::const_iterator end = str.end(); 
while (b != end) { 
    std::string::const_iterator it = std::find(b, str.end(), '|'); 
    valueVect.push_back(); 
    std::string& newStr = valueVect.back(); 
    newStr.append(b, it); 
    b = it; 
    if (b != end) 
    ++b; 
}