2017-06-14 79 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; 
} 
相關問題