将std :: string拆分为std :: pair的最短代码

时间:2015-07-08 11:49:16

标签: c++ std

我有一个文本,格式为“key:value”。实际文字可能看起来像"Server: nginx""Server:nginx",忽略了密钥:和值之间的空格。

将此分成std::pair<std::string, std::string>的最快最短的方法是什么?

4 个答案:

答案 0 :(得分:5)

大卫很接近,但他实际上没有测试他的代码。

这是一个有效的版本。

auto index = str.find(':');
std::pair<std::string,std::string> keyVal;
if (index != std::string::npos) {

   // Split around ':' character
   keyVal = std::make_pair(
      str.substr(0,index),
      str.substr(index+1)
   );

   // Trim any leading ' ' in the value part
   // (you may wish to add further conditions, such as '\t')
   while (!keyVal.second.empty() && keyVal.second.front() == ' ') {
      keyVal.second.erase(0,1);
   } 
}

live demo

答案 1 :(得分:1)

我说

auto index = str.find(":");
std::pair<std::string,std::string> keyVal
if (index != std::string::npos){
 keyVal = std::make_pair( str.substr(0,str.size()-index),
 str.substr(index+1, std::string::npos));
 if (keyVal.second.front() == ' ') {keyVal.second.erase(0,1); } 
} 
如果分隔符为&#34;:&#34;这将删除空格。而不是&#34;:&#34;

当然,您可以使代码变得更加松散,并删除更多行,并直接使用str.find(":")而不是&#39; index&#39;。

答案 2 :(得分:1)

我会使用stringstream并使用:

string str = "Server: nginx with more stuff";
std::string key, val;
std::stringstream ss(str);
std::getline(ss, key, ':');
std::getline(ss, val);
auto p = make_pair(key, val);
if (p.second.front() = ' ') // get rid of leading space if it exist
    p.second.erase(0, 1);

答案 3 :(得分:0)

我建议使用正则表达式(如果你的值的模式在运行时不会改变): http://www.cplusplus.com/reference/regex/

但是考虑到性能,你应该对上面显示的所有可能性进行速度测试(手动字符串解析,使用字符串流,正则表达式,......