我需要遍歷一個購物清單,我已將其放入一個向量,並通過數量和項目名稱進一步分隔每行。我怎樣才能得到一個與作爲第一個項目的數字和第二個項目名稱的一對?C++ - 從std :: string解析數字
例子:
vector<string> shopping_list = {"3 Apples", "5 Mandarin Oranges", "24 Eggs", "152 Chickens"}
我不知道數量將有多大,所以我不能用恆定的指標。
理想情況下,我想成對的向量。
我需要遍歷一個購物清單,我已將其放入一個向量,並通過數量和項目名稱進一步分隔每行。我怎樣才能得到一個與作爲第一個項目的數字和第二個項目名稱的一對?C++ - 從std :: string解析數字
例子:
vector<string> shopping_list = {"3 Apples", "5 Mandarin Oranges", "24 Eggs", "152 Chickens"}
我不知道數量將有多大,所以我不能用恆定的指標。
理想情況下,我想成對的向量。
您可以編寫一個函數來拆分數量和項目類似以下內容:
#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);
您可以按如下方式使用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
是您需要的數字。
我建議你以下沒有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;
}
我最終發現stringstream沒有=運算符的錯誤。 –
是的,這是一個<<不是=。抱歉 – 97amarnathk