2013-06-28 7 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

С моей точки зрения лучшим решением является не использование библиотеки ускорения, поскольку она добавляет накладные расходы на ваш код. Следующий код будет делать ту же работу:

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

В чистом C++ 03, это примерно так же эффективно, как я могу получить его:

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; 
}