我需要遍历一个已经放入向量中的购物清单,并进一步通过数量和项目名称将每行分开。如何获得一个数作为第一项,项目名称作为第二项的配对呢?
示例:
vector<string> shopping_list = {"3 Apples", "5 Mandarin Oranges", "24 Eggs", "152 Chickens"}
我不确定数字有多大,所以不能使用固定的索引。
理想情况下,我希望使用一种对向量进行配对的方法。
我需要遍历一个已经放入向量中的购物清单,并进一步通过数量和项目名称将每行分开。如何获得一个数作为第一项,项目名称作为第二项的配对呢?
示例:
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));
...
}
是您所需的数字。
我建议您使用以下解决方案,而不是使用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;
}