【问题标题】:Going from string to stringstream to vector<int>从字符串到字符串流到向量<int>
【发布时间】:2010-10-02 02:42:51
【问题描述】:

我有一个我想在我的应用程序上实现的步骤的示例程序。我想将字符串上的 int 元素分别 push_back 到一个向量中。我怎样才能?

#include <iostream>
#include <sstream>

#include <vector>

using namespace std;

int main(){

    string line = "1 2 3 4 5"; //includes spaces
    stringstream lineStream(line);


    vector<int> numbers; // how do I push_back the numbers (separately) here?
    // in this example I know the size of my string but in my application I won't


    }

【问题讨论】:

    标签: c++ string vector stringstream


    【解决方案1】:

    这是std::back_inserter的经典例子。

    copy(istream_iterator<int>(lineStream), istream_iterator<int>(),
         back_inserter(numbers));
    

    如果您愿意,您可以从一开始就创建矢量

    vector<int> numbers((istream_iterator<int>(lineStream)), 
                        istream_iterator<int>());
    

    记得在第一个参数周围加上括号。编译器认为这是一个函数声明,否则。如果您使用向量仅获取数字的迭代器,则可以直接使用 istream 迭代器:

    istream_iterator<int> begin(lineStream), end;
    while(begin != end) cout << *begin++ << " ";
    

    【讨论】:

    • 这是一个完美的例子,恕我直言,C++ 出了什么问题。在几乎所有其他语言中,这将是对 ' ' 的拆分,然后是每个元素的 .toInt() 之类的东西。相反,我们应用了非常复杂的模板化算法集合。
    • 我听到你在说什么。 OTOH,这种更复杂的方法更快,因为您避免创建临时数组或字符串列表,而且功能更强大——几乎相同的代码可用于复制任何类型的“值范围”(由一对迭代器)到一个向量中。
    • C++11: vector&lt;int&gt; numbers(istream_iterator&lt;int&gt;(lineStream), {});
    • @KerrekSB yours 是我见过的第一个将初始化列表传递给推导模板参数的非理论示例。不错
    【解决方案2】:
    int num;
    while (lineStream >> num) numbers.push_back(num);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 2015-01-22
      相关资源
      最近更新 更多