1. string转map
主要用到 std::getline()
和 std::ws
#include <map>
#include <string>
#include <sstream>
#include <iostream>
std::map<std::string, std::string> mappify1(std::string const& s)
{
std::map<std::string, std::string> m;
std::string key, val;
std::istringstream iss(s);
// iss >> std::ws 将流的前导空格去掉
while(std::getline(std::getline(iss >> std::ws, key, ‘:‘) >> std::ws, val))
m[key] = val;
return m;
}
std::map<std::string, std::string> mappify2(std::string const& s)
{
std::map<std::string, std::string> m;
std::string::size_type key_pos = 0;
std::string::size_type key_end;
std::string::size_type val_pos;
std::string::size_type val_end;
while((key_end = s.find(‘:‘, key_pos)) != std::string::npos)
{
if((val_pos = s.find_first_not_of(": ", key_end)) == std::string::npos)
break;
val_end = s.find(‘\n‘, val_pos);
m.emplace(s.substr(key_pos, key_end - key_pos), s.substr(val_pos, val_end - val_pos));
key_pos = val_end;
if(key_pos != std::string::npos)
++key_pos;
}
return m;
}
int main()
{
std::string s = "CA: ABCD\nCB: ABFG\nCC: AFBV\nCD: 4567";
std::cout << "mappify1: " << ‘\n‘;
auto m = mappify1(s);
for(auto const& p: m)
std::cout << ‘{‘ << p.first << " => " << p.second << ‘}‘ << ‘\n‘;
std::cout << "mappify2: " << ‘\n‘;
m = mappify2(s);
for(auto const& p: m)
std::cout << ‘{‘ << p.first << " => " << p.second << ‘}‘ << ‘\n‘;
}