2014-03-30 73 views
0

我有一個字符串,它具有不同的城市名稱。這樣的格式:根據另一個操作字符串中的特定位置

string cities = "-Paris-Berlin-Cologne-" 

而且還有另一個字符串,其中包含這些城市的投票結果。

string vote = "-31.2-42.5-40-" 

我需要定義一個函數,它接受來自用戶的前輸入:柏林 然後函數會查找和更改的表決結果在「串票」

我試着用計數「 - 」分隔符但我無法成功。

任何幫助將不勝感激。

謝謝。

回答

0

分割掃描兩個字符串的分隔符,並把結果在地圖

std::vector<std::string> split(std::string const& s, std::string const& sep); 

std::vector<std::string> const c = split(cities, "-"); 
std::vector<std::string> const v = split(votes, "-"); 

// now put them all in a map 
assert(c.size() == v.size()); 
std::map<std::string, float> city2vote; 

for (std::vector<std::string>::size_type i=0; i != c.size(); ++i) 
{ 
    city2vote[c[i]] = atof(v[i]); 
} 

// update vote for Berlin 
city2vote["Berlin"] = 42.0; 

split函數是兩岸向前的,但Boost也提供了一個實現,如果你可以使用庫。爲了簡單起見,我使用了atof。在現實生活中,串流將是更好的選擇。

0

會使用正則表達式搜索找到連字符串中的位置,然後改變這些位置之間的值相應地是一個可接受的解決方案?

編輯 - 退一步來說,你不必通過使用正則表達式過於複雜的事情,你可以只使用一個for循環通過串

0

首先,我認爲您應該將每個分隔字符串從cities映射到vote。你可以這樣說:

std::map<std::string, std:string> city_to_vote; 
std::istringstream i1(cities), i2(vote); 

for (std::string str1, str2; std::getline(i1, str1, '-') && 
          std::getline(i2, str2, '-');) 
{ 
    if (!str1.empty() && !str2.empty()) 
    { 
     city_to_vote.emplace(std::make_pair(str1, str2)); 
    } 
} 

然後,一旦你接收來自用戶的字符串輸入,檢查它是否在地圖內,訪問它映射到的值,並使用替換算法來增強vote字符串。

相關問題