Например, у меня есть вектор на основе строк:

vector<string> text_vec;

В каждой строке хранится несколько слов. Итак, мне нужно скопировать каждое слово из этого вектора в другой вектор-строку, но я должен поместить каждое слово в отдельную строку. Как я могу это сделать?

1
DISTURBED 8 Мар 2015 в 14:09

2 ответа

Лучший ответ

Вы имеете в виду, что ваше векторное содержимое выглядит так?

{ "word0", "word1 word2 word3", "word4 word5" }

И вы хотите получить такой результат:

{ "word0", "word1", "word2", "word3", "word4", "word5" }

Первое, что важно - определить из чего состоит слово . Я предполагаю, что слово - это все, разделенное хотя бы одним пробелом. На практике вы можете решить несколько особых случаев, например:

  • Пустые строки.
  • Другие символы пробела.
  • Новые строки.

Давайте сначала определим функцию разделения строк, которая принимает std::string и возвращает std::vector<std::string>. Сначала он обеспечит простое разделение с использованием вышеупомянутого предположения; вы можете сделать его более сложным позже:

std::vector<std::string> split(std::string const& input)
{
    std::vector<std::string> result;
    std::istringstream is(input);
    std::string word;
    while (is >> word)
    {
        result.push_back(word);
    }
    return result;
}

Имея эту функцию в нашем распоряжении, мы можем применить ее к вашему входному вектору:

std::vector<std::string> normalise(std::vector<std::string> const& strings)
{
    std::vector<std::string> result;
    for (auto const& string : strings)
    {
        auto const tokens = split(string);
        for (auto const& token : split(string))
        {
            result.push_back(token);
        }
    }
    return result;
}

Вот полная программа тестирования:

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

std::vector<std::string> split(std::string const& input)
{
    std::vector<std::string> result;
    std::istringstream is(input);
    std::string word;
    while (is >> word)
    {
        result.push_back(word);
    }
    return result;
}

std::vector<std::string> normalise(std::vector<std::string> const& strings)
{
    std::vector<std::string> result;
    for (auto const& string : strings)
    {
        auto const tokens = split(string);
        for (auto const& token : split(string))
        {
            result.push_back(token);
        }
    }
    return result;
}

int main()
{
    std::vector<std::string> const input = { "word0", "word1 word2 word3", "word4 word5" };

    for (auto const& word : normalise(input))
    {
        std::cout << word << "\n";
    }
}
1
Christian Hackl 8 Мар 2015 в 11:40
vector<string> text_vec_2;

for(unsigned int i=0;i<text_vec.size();++i){

     // assuming a split-function which you have created
     // which returns a vector with the individual words
    vector<string> words = splitString(text_vec[i]);

    // copy the words into the new vector
    for(unsigned int j=0;j<words.size();++j){
        text_vec_2.push_back(words[j]);
    }
}
1
jensa 8 Мар 2015 в 11:20