我需要遍历一个购物清单,我已将其放入一个向量,并通过数量和项目名称进一步分隔每行。我怎样才能得到一个与作为第一个项目的数字和第二个项目名称的一对?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