根据彼此操纵字符串中的特定位置

时间:2014-03-30 13:35:08

标签: c++ string

我有一个具有不同城市名称的字符串。格式如下:

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

还有另一个字符串,其中包含这些城市的一些投票结果。

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

我需要定义一个从用户输入ex:Berlin的函数 然后函数将在“字符串投票”中找到并更改投票结果

我尝试计算“ - ”分隔符,但我无法成功。

任何帮助都会表示赞赏。

谢谢。

3 个答案:

答案 0 :(得分:0)

使用正则表达式搜索来查找连字符字符串中的位置,然后相应地更改这些位置之间的值是可接受的解决方案吗?

编辑 - 再想一想,你不需要使用正则表达式来复杂化,你可以只使用for循环来扫描字符串

答案 1 :(得分: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;

分割功能是向前发展的,但如果你可以使用库,Boost也提供了一个实现。为简单起见,我使用了atof。在现实生活中,弦流将是一个更好的选择。

答案 2 :(得分: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字符串。