有没有一种简单的方法可以将由空格分隔的数字串转换为int的向量或者我可以轻松转换为向量的东西?
我正在创建一个输入操作符(>>),使用从命令行输入的值来创建二叉树。这是它的主要内容
int main(int argc, char **argv)
{
stringstream stream;
stream << " 10" << " 11" << " 10" << " 2" << endl;
tree = new binary_tree();
stream >> *tree;
if (tree->inorder() != string("7 10 11")) //inorder() prints the tree in order
cout << "Test passed" << endl;
delete tree;
return 0;
}
我遇到的问题是,虽然我可以创建和打印我需要的值,但我无法转换它们并将它们放入向量中 - 我有一个工作定义的方法,可以从值创建树
std::istream& operator>>(std::istream &in, binary_tree &value)
{
vector<int> input_tree;
string readline;
getline(in, readline);
cout << "(" << readline << ")" << endl; //prints correctly - (10 11 10 2)
//where I need to insert insert values into vector
for(int i = 0; i < input_tree.size(); i++)
{
insert(input_tree[i], value); //inserts the values from a vector into a binary tree
}
return in;
}
我已尝试在字符串中循环并在每个字符上使用stoi(),但只要空格导致错误,它总是出错。
感谢您提供任何帮助,如果我错过了任何重要信息,请致谢。
答案 0 :(得分:2)
你可以这样做:
vector<int> vec((istream_iterator<int>(in)), istream_iterator<int>());
这将读取in
中的整数,并将它们全部插入vec
一行。这是istream_iterator
的一个非常规范的用法,它是标准库的一部分。然后你不需要阅读每一行并自己解析它。
如果您想详细了解其工作原理,请参阅此处:How does std::copy work with stream iterators
至于为什么围绕第一个参数看起来有一对额外的括号,那是因为“最令人烦恼的解析”:https://en.wikipedia.org/wiki/Most_vexing_parse - 只是一个愚蠢的C ++语法怪癖。
答案 1 :(得分:0)
我认为(虽然不那么简洁)有点容易理解的解决方案:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int main() {
string s= "4 5 6";
stringstream ss(s);
vector<int> v;
int hlp;
while(ss >> hlp)
{
v.push_back(hlp);
}
for(auto i: v)
cout << i << '\n';
return 0;
}
您可以使用stringstream
,就像使用cin
一样。