push_back vector <char>中的所有内容,将它们组合为vector <string>

时间:2018-11-17 04:46:33

标签: c++ string

我正在尝试将带有空格的字符串解析成几个字符串,并将它们存储到一个列表中,该列表由没有任何空格的字符串组成。我不知道输入的字符串会持续多长时间,并且我有以下代码:

#include <bits/stdc++.h>
#include <sstream>

using namespace std;

vector<string> myWords;
vector<char> myBuffer;

int main() {
    string mySentence;
    getline(cin, mySentence);

    int j = 0;
    for (int i = 0; i < mySentence.length(); i++) {
        if (mySentence[i] != ' ') myBuffer.push_back(mySentence[i]);
        else {
            myWords.push_back(myBuffer);
            myBuffer.clear();
            j++;
        }
    }

    return 0;
}

我遇到的错误是myWords.push_back(myBuffer);。我该如何解决?

1 个答案:

答案 0 :(得分:3)

问题是您正在尝试将std::vector<char>推入std::string的地方。因此,只需将myBuffer的类型更改为std::string

#include <iostream>
#include <string>

int main() {
    std::string mySentence;
    std::getline(std::cin, mySentence);

    std::vector<std::string> myWords;
    std::string myBuffer;

    for (int i = 0; i < mySentence.length(); i++) {
        if (mySentence[i] != ' ')
            myBuffer.push_back(mySentence[i]);
        else {
            myWords.push_back(myBuffer);
            myBuffer.clear();
        }
    }

    if (!myBuffer.empty()) {
        myWords.push_back(myBuffer);
    }

    // use myWords as needed...

    return 0;
}

话虽这么说,使用std::istringstream会更简单,因为operator>>为您读取流中由空格分隔的值:

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

int main() {
    std::string mySentence;
    std::getline(std::cin, mySentence);

    std::vector<std::string> myWords;
    std::string myBuffer;

    std::istringstream iss(mySentence);
    while (iss >> myBuffer) {
        myWords.push_back(myBuffer);
    }

    // use myWords as needed...

    return 0;
}

或者,让标准库为您处理阅读和推送操作:

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

int main() {
    std::string mySentence;
    std::getline(std::cin, mySentence);

    std::vector<std::string> myWords;

    std::istringstream iss(mySentence);
    std::copy(
        std::istream_iterator<std::string>(iss),
        std::istream_iterator<std::string>(),
        std::back_inserter(myWords)
    );

    // use myWords as needed...

    return 0;
}