2013-05-29 43 views
1

我有一个包含像数据的载体:使用istringstream来标记的std :: string到std ::地图

std::vector<std::string> v; 

v[0] = "first:tom"; 
v[1] = "last:jones"; 

,我想通过矢量进行迭代,并在:解析,并把结果在std::map

std::vector<std::string> v; 
std::map<std::string, std::string> m; 
std::pair<std::string, std::string> p; 

for(int i = 0; i < v.size(); i++) 
{ 
    std::cout << v[i] << std::endl; 

    std::istringstream oss(v[i]); 
    std::string token; 

    while(getline(oss, token, ':')) 
    { 
     m.insert(std::pair<std::string, std::string>("", "")); 
    }    
} 

我卡在插入到std::map,因为我没有看到解析如何给我,我可以插入到地图两件。

这两个都不是v [i]。

我想:

m.insert(std::pair<std::string, std::string>("first", "tom")); 
m.insert(std::pair<std::string, std::string>("last", "jones")); 

谁能解释一下我的难处?

回答

3

尝试

std::vector<std::string> v; 
std::map<std::string, std::string> m; 

for(int i = 0; i < v.size(); i++) 
{ 
    std::cout << v[i] << std::endl; 

    size_t sepPosition = v[i].find (':'); 
    //error handling 
    std::string tokenA = v[i].substr(0, sepPosition); 
    std::string tokenB = v[i].substr(sepPosition + 1) 

    m.insert(std::pair<std::string, std::string>(std::move(tokenA), std::move(tokenB)));    
} 
+0

这个工作,我喜欢它通过2'substr'operations明确 – Jason

+0

@Jason:一定要检查'sepPosition'的值,并确认它不等于'std :: string :: npos'。 –

2

事情是这样的:

std::vector<std::string> v; 
std::map<std::string, std::string> m; 
std::pair<std::string, std::string> p; 

for(int i = 0; i < v.size(); i++) 
{ 
    std::cout << v[i] << std::endl; 

    std::istringstream oss(v[i]); 
    std::string key; 
    std::string value; 

    while(getline(oss, key, ':') && getline(oss, value)) 
    { 
     m.insert(std::pair<std::string, std::string>(key, value)); 
    }    
} 
+0

这工作呢! – Jason

1

使用std::transform

transform(v.begin(), v.end(), inserter(m, m.begin()), chopKeyValue); 

其中chopKeyValue是:

pair<string, string> chopKeyValue(const string& keyValue) { 
    string::size_type colon = keyValue.find(':'); 
    return make_pair(keyValue.substr(0, colon), keyValue.substr(colon+1)); 
} 
0

而另一个选项(C++ 11):

std::vector<std::string> v = { "first:tom", "last:jones" }; 
std::map<std::string,std::string> m; 

for (std::string const & s : v) { 
    auto i = s.find(':'); 
    m[s.substr(0,i)] = s.substr(i + 1); 
} 
+0

务必检查sepPosition的值,并确认在实际代码中不等于'std :: string :: npos' –

相关问题