2017-06-14 93 views
3

我需要遍历一个购物清单,我已将其放入一个向量,并通过数量和项目名称进一步分隔每行。我怎样才能得到一个与作为第一个项目的数字和第二个项目名称的一对?C++ - 从std :: string解析数字

例子:

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

我不知道数量将有多大,所以我不能用恒定的指标。

理想情况下,我想成对的向量。

回答

5

您可以编写一个函数来拆分数量和项目类似以下内容:

#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

2

您可以按如下方式使用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)); 
    ... 
} 

num是您需要的数字。

+0

我最终发现stringstream没有=运算符的错误。 –

+0

是的,这是一个<<不是=。抱歉 – 97amarnathk

0

我建议你以下没有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; 
}