按空格分割一串正/负整数

时间:2016-11-01 18:26:03

标签: c++ string

我有以下字符串:

1 -2 -8 4 51

我想得到一个包含5个元素的向量,每个元素对应于字符串中的5个数字。基本上,我想将空格分隔上面的字符串作为分隔符。

我在Stack Overflow上发现了很多这样的问题,但到目前为止,他们中的任何一个都不能得到第一个“1”和最后一个(来自51)。 我的代码如下:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>

using namespace std;

std::vector<std::string> split(std::string str)
{
    std::string buf; 
    std::stringstream ss(str); 
    vector<std::string> tokens; 

    while (ss >> buf)
        tokens.push_back(buf);
    return tokens;
}

int main()
{

    std::string temps = "1 -2 -8 4 51";

    std::vector<std::string> x = split(temps);
    for (int j = 0; j < x.size(); j++){
        cout << x[j] << endl;    
    }
}

我的输出如下:

-2
-8
4
5

如您所见,跳过了第一个和最后一个。 我对C ++很新(我可能已经习惯了其他语言的内置函数.split())但我在上面的代码中看不出任何错误。 谁能帮助我理解我做错了什么?

1 个答案:

答案 0 :(得分:1)

你展示的代码一般都很好。输出是预期的,因此问题必须超出您显示的代码。

但请注意,您的vector将包含std::string个值,而不是int个值。此外,您应该考虑使用std::istringstream作为输入,而不是使用std::stringstream

如果你想要一个整数向量,试试这个:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

std::vector<int> split(const std::string &str)
{
    int num; 
    std::istringstream iss(str); 
    std::vector<int> tokens; 

    while (iss >> num)
        tokens.push_back(num);

    return tokens;
}

int main()
{
    std::string temps = "1 -2 -8 4 51";

    std::vector<int> x = split(temps);
    for (int j = 0; j < x.size(); j++) {
        std::cout << x[j] << std::endl;
    }

    return 0;
}

然后,您可以split()使用std::istream_iteratorstd::back_inserter而不是手动循环,例如:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
#include <algorithm>

std::vector<int> split(const std::string &str)
{
    std::istringstream iss(str); 
    std::vector<int> tokens; 

    std::copy(
        std::istream_iterator<int>(iss),
        std::istream_iterator<int>(),
        std::back_inserter(tokens)
    );

    return tokens;
}

int main()
{
    std::string temps = "1 -2 -8 4 51";

    std::vector<int> x = split(temps);
    for (int j = 0; j < x.size(); j++) {
        std::cout << x[j] << std::endl;
    }

    return 0;
}

然后你可以让`split()成为一个模板函数,这样它就可以根据你想要的输入字符串返回不同类型的向量,例如:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <iterator>
#include <algorithm>

template<typename T>
std::vector<T> split(const std::string &str)
{
    std::istringstream iss(str); 
    std::vector<T> tokens; 

    std::copy(
        std::istream_iterator<T>(iss),
        std::istream_iterator<T>(),
        std::back_inserter(tokens)
    );

    return tokens;
}

int main()
{
    std::string temps = "1 -2 -8 4 51";

    std::vector<int> x = split<int>(temps);
    for (int j = 0; j < x.size(); j++) {
        std::cout << x[j] << std::endl;
    }

    return 0;
}