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

'的boost :: algorithm'擁有的東西,將給你一個指向每個令牌的指針,而不是一個副本,但我不記得它的名字。或者,您可以'emplace_back'以避免複製到容器中。 –

+0

編譯器的版本和名稱? C++ 11支持?有一些明顯的改進。 – Yakk

+0

Visual C++ - Visual 2010 – user373215

回答

0

從我的觀點來看,更好的解決方案不是使用boost庫,因爲它增加了代碼的開銷。下面的代碼將做同樣的工作:

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