C++ - 从std::string解析数字

4

我需要遍历一个已经放入向量中的购物清单,并进一步通过数量和项目名称将每行分开。如何获得一个数作为第一项,项目名称作为第二项的配对呢?

示例:

vector<string> shopping_list = {"3 Apples", "5 Mandarin Oranges", "24 Eggs", "152 Chickens"}

我不确定数字有多大,所以不能使用固定的索引。

理想情况下,我希望使用一种对向量进行配对的方法。

3个回答

4
您可以编写一个函数来拆分数量和物品,如下所示:
#include <sstream>

auto split( const std::string &p ) {
    int num;
    std::string item;

    std::istringstream  ss ( p);
    ss >>num ; // assuming format is integer followed by space then item
    getline(ss, item); // remaining string
    return make_pair(num,item) ;
}

然后使用std::transform来获取一对向量:

std::transform( shopping_list.cbegin(),
                   shopping_list.cend(),
                   std::back_inserter(items), 
                   split );

See Here


1
您可以按照以下方式使用std :: stringstream
vector< pair<int,string> > myList;
for(int i=0;i<shopping_list.size();i++) {
    int num;
    string item;
    std::stringstream ss;
    ss<<shopping_list[i];
    ss>>num;
    ss>>item;
    myList.push_back(make_pair(num,item));
    ...
}
是您所需的数字。

我最终遇到了一个错误,即stringstream没有=运算符。 - user8134177
是的,那是一个 << 而不是 =。抱歉。 - 97amarnathk

1

我建议您使用以下解决方案,而不是使用stringstream,这只是一种替代方案

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main() {
    vector<string> shopping_list = { "3 Apples", "5 Mandarin Oranges", "24 Eggs", "152 Chickens" };
    vector< pair<int, string> > pairs_list;

    for (string s : shopping_list)
    {
        int num;
        string name;
        int space_pos = s.find_first_of(" ");
        if (space_pos == std::string::npos)
            continue; // format is broken : no spaces

        try{
            name = s.substr(space_pos + 1);
            num = std::stoi(s.substr(0, space_pos));
        }
        catch (...)
        {
            continue; // format is broken : any problem
        }
        pairs_list.push_back(make_pair(num, name));
    }

    for (auto p : pairs_list)
    {
        cout << p.first << " : " << p.second << endl;
    }

    return 0;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接