我有一个以键为字符串的映射,值为字符串向量,如下所示
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 :(得分: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;
}
答案 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;
}