Разделить строку в соответствии с комбинацией символов / в `\ n` - PullRequest
0 голосов
/ 15 мая 2018

Как правильно разделить строку, как показано ниже, в определенной комбинации символов в вектор строки?

string myString = "This is \n a test. Let's go on. \n Yeah.";

разделите на "\n", чтобы получить такой результат:

vector<string> myVector = { 
                              "This is ",
                              " a test. Let's go on. ",
                              " Yeah." 
                           }

Я использовал алгоритм повышения библиотека, но теперь я хотел бы достичь всего этого без использования внешней библиотеки, такой как boost.

#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp> 

std::vector<std::string> result;
boost::split(result, "This is \n a test. Let's go on. \n Yeah.", 
              boost::is_any_of("\n"), boost::token_compress_on);

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Как насчет этого:

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

class line : public std::string {};

std::istream &operator>>(std::istream &iss, line &line)
{
    std::getline(iss, line, '\n');
    return iss;
}

int main()
{

    std::istringstream iss("This is \n a test. Let's go on. \n Yeah.");
    std::vector<std::string> v(std::istream_iterator<line>{iss}, std::istream_iterator<line>{});

    // test
    for (auto const &s : v)
        std::cout << s << std::endl;

    return 0;
}

По сути, создайте новый тип строки, который является строкой, и используйте потоковый итератор для чтения целых строк прямо в конструкторе диапазона векторов

Рабочая демоверсия: https://ideone.com/4qdfY2

0 голосов
/ 15 мая 2018

Решение 1: Просто удалить "\n" из строки.

Просто чтобы удалить "\n", вы можете использовать erase-remove idiom . СМОТРИТЕ ЗДЕСЬ ЗДЕСЬ

#include <iostream>
#include <string>
#include <algorithm>

int main()
{
   std::string myString = "This is \n a test. Let's go on. \n Yeah.";
   myString.erase(std::remove(myString.begin(), myString.end(), '\n'), 
                                                      myString.end());
   std::cout << myString<< std::endl;
}

Выход:

This is  a test. Let's go on.  Yeah

Решение 2 : удалить "\n" из строки и сохранить каждое разбиение в \n в вектор. (Ип-эффективный)

Заменить все вхождения \n некоторыми другими символами, которых нет в строке (здесь я выбрал ;). Затем выполните синтаксический анализ с помощью std::stringstream и std::getline следующим образом. СМОТРИТЕ ЗДЕСЬ ЗДЕСЬ

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

int main()
{
   std::string myString = "This is \n a test. Let's go on. \n Yeah.";
   std::replace(myString.begin(), myString.end(), '\n', ';');
   std::stringstream ssMyString(myString);
   std::string each_split;
   std::vector<std::string> vec;
   while(std::getline(ssMyString, each_split, ';')) vec.emplace_back(each_split);
   for(const auto& it: vec) std::cout << it << "\n";
}

Выход:

This is 
 a test. Let's go on. 
 Yeah.

Решение 3 : удалить "\n" из строки и сохранить каждое разбиение в \n в вектор.

Перебрать строку и найти позиции (используя std::string::find), где \n (конечная позиция) находит. Отодвиньте подстроки (std::string::substr), используя информацию о начальной позиции и количестве указателей между начальной и конечной позицией. Каждый раз обновляйте начальную и конечную позиции, чтобы поиск не начинался снова с beging входной строки. СМОТРИТЕ ЗДЕСЬ ЗДЕСЬ

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

int main()
{
    std::string myString = "This is \n a test. Let's go on. \n Yeah.";
    std::vector<std::string> vec;

    std::size_t start_pos = 0;
    std::size_t end_pos = 0;
    while ((end_pos = myString.find("\n", end_pos)) != std::string::npos)
    {
        vec.emplace_back(myString.substr(start_pos, end_pos - start_pos));
        start_pos = end_pos + 1;
        end_pos += 2;
    }
    vec.emplace_back(myString.substr(start_pos, myString.size() - start_pos)); // last substring

    for(const auto& it: vec) std::cout << it << "\n";
}

Выход:

This is 
 a test. Let's go on. 
 Yeah.
...