将一串数字转换为int向量c ++

时间:2016-04-24 02:43:41

标签: c++ string vector int

有没有一种简单的方法可以将由空格分隔的数字串转换为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(),但只要空格导致错误,它总是出错。

感谢您提供任何帮助,如果我错过了任何重要信息,请致谢。

2 个答案:

答案 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一样。

http://ideone.com/Y6UfuW