2013-05-29 75 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' –

相關問題