Например, у меня есть вектор на основе строк:
vector<string> text_vec;
В каждой строке хранится несколько слов. Итак, мне нужно скопировать каждое слово из этого вектора в другой вектор-строку, но я должен поместить каждое слово в отдельную строку. Как я могу это сделать?
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";
}
}
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]);
}
}
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .