有没有类似Python中的C ++中的split()?

时间:2019-04-20 12:16:22

标签: c++ input onlinejudge

我是竞争编程的新手,我在接受一行空格分隔的整数作为C ++输入并将这些整数存储在向量中的问题。

在关于Stackoverflow的类似问题的答案中,我发现,那里提供的代码比解决编程问题所需的核心代码占用更多的时间和空间,而这些代码片段对于此类任务而言确实很复杂。因此,我编写了自己的解决方案,并尝试打印实际上似乎不起作用的向量的存储元素。

#include <iostream>
#include <vector>
using namespace std;

int main(){

    vector<int> A;
    int tmp;

    while((cin >> tmp) && (!EOF)){
       A.push_back(tmp);
    }

    for(int i : A){
       cout << i << " ";
    } 

    return 0;
}

我编译时没有任何错误,并且似乎可以正常工作。但是,一旦我完成了使用空格分隔的整数序列并按ENTER键,程序就会突然终止执行而不会打印结果。请提出我应该在代码中进行的任何更正。如果您可以提供一些有关C ++是否与Python中的split()类似的信息,将很有帮助。非常感谢您提供一个简单的代码段。

2 个答案:

答案 0 :(得分:1)

您可以使用std::istream_iterator读取由空格分隔到某个容器中的整数(或您已经/定义了operator>>的其他任何东西):

std::vector<int> v;
std::copy(std::istream_iterator<int>{std::cin}, std::istream_iterator{}, std::back_inserter(v));

如果您只想读取一行,然后首先使用std::getline获得该行,请将填充的std::string包裹在std::istringstream中,然后在该流上使用以上内容(而不是std::cin

答案 1 :(得分:0)

您可以将整个输入字符串存储到一个字符串变量中,然后对其进行迭代,并在遇到空格字符或完成字符串迭代时提取子字符串。当您获得数字字符串时,可以在使用stoi向量之前通过使用A函数将它们转换为整数值:

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

using namespace std;

int main(){

    vector<int> A;
    string input;
    size_t index = 0; // keep track of number first index

    getline(cin, input);

    for (size_t i = 0; i < input.size(); ++i) {
        if (input[i] == ' ') {
            A.push_back(stoi(input.substr(index, i)));
            index = i + 1;
        }
    }
    A.push_back(stoi(input.substr(index, input.size())));


    for(int i : A){
       cout << i << " ";
    } 
    cout << endl;

    return 0;
}