我有一個字符串,它具有不同的城市名稱。這樣的格式:根據另一個操作字符串中的特定位置
string cities = "-Paris-Berlin-Cologne-"
而且還有另一個字符串,其中包含這些城市的投票結果。
string vote = "-31.2-42.5-40-"
我需要定義一個函數,它接受來自用戶的前輸入:柏林 然後函數會查找和更改的表決結果在「串票」
我試着用計數「 - 」分隔符但我無法成功。
任何幫助將不勝感激。
謝謝。
我有一個字符串,它具有不同的城市名稱。這樣的格式:根據另一個操作字符串中的特定位置
string cities = "-Paris-Berlin-Cologne-"
而且還有另一個字符串,其中包含這些城市的投票結果。
string vote = "-31.2-42.5-40-"
我需要定義一個函數,它接受來自用戶的前輸入:柏林 然後函數會查找和更改的表決結果在「串票」
我試着用計數「 - 」分隔符但我無法成功。
任何幫助將不勝感激。
謝謝。
分割掃描兩個字符串的分隔符,並把結果在地圖
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。在現實生活中,串流將是更好的選擇。
會使用正則表達式搜索找到連字符串中的位置,然後改變這些位置之間的值相應地是一個可接受的解決方案?
編輯 - 退一步來說,你不必通過使用正則表達式過於複雜的事情,你可以只使用一個for循環通過串
首先,我認爲您應該將每個分隔字符串從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
字符串。