2015-01-03 3 views
0

Я работаю с несколькими длинными строками внутри программы на C++ (до 65535 букв). Что я ищу способ, чтобы добавить новую строку каждый определенное количество букв с функцией, как это:Добавить новую строку для каждого количества букв в std :: string

addNewLinesToString(std::string* string, u8 lettersBetween newline); 

, которая будет работать так:

string test = "Testing1234567"; 
addNewLinesToString(&test, 7); //test == "Testing\n1234567\n" 

Я до сих пор найти такие функция, которая использовала только стандартную библиотеку классов (C и/или C++)

Если у кого-то есть простое решение для этого было бы здорово :) Спасибо.

+1

Одним из вариантов было бы разбить строку на подстроки 'length/newline' и перестроить вашу строку. Однако не уверен в производительности. –

ответ

3
std::string insert_newlines(const std::string &in, const size_t every_n) 
{ 
    std::string out; 
    out.reserve(in.size() + in.size()/every_n); 
    for(std::string::size_type i = 0; i < in.size(); i++) { 
     if (!(i % every_n) && i) { 
      out.push_back('\n'); 
     } 
     out.push_back(in[i]); 
    } 
    return out; 
} 

Это:

  • выделяет память ровно один раз.
  • не делает ошибку при использовании int, где size_t или std::string::size_type не требуется, поэтому вы не сталкиваетесь с непонятными проблемами для больших строк или встроенных платформ.
  • работает в линейном O(n) раз.
  • имеет функциональный интерфейс (вместо изменения строки на месте), алгоритм, который модифицирует входную строку и работает в O(n), будет намного сложнее.
5

Для этой цели вы можете использовать string::insert.

addNewLinesToString(std::string& str, int sep) 
{ 
    for (int i = 0; i < str.size(); i += sep) 
     str.insert(i, "\n"); 
} 

Но это будет O (N^2) (как указано на @stefan), вы также можете

addNewLinesToString(std::string& str, int sep) 
{ 
    string ans; 
    int i = 0; 
    while (i < str.size()) 
    { 
     if (i % sep == 0 && i) 
      ans.push_back('\n'); 
     ans.push_back(str[i]); 
     i++; 
    } 
    return ans; 
} 

который использует больше памяти, но это O (п).

Посмотрите на примеры: http://www.cplusplus.com/reference/string/string/insert/

+1

Этот алгоритм является 'O (n^2)'. Мы можем легко создать алгоритм, который работает на 'O (n)' времени. – Stefan

+0

@Stefan Спасибо, обновил сообщение –

+0

Спасибо, очень полезно :) –

3

Попробуйте эту функцию:

void addNewLinesToString(std::string* s, int change){ 
    if(change <= 0) 
     return; 
    for(int i = 0; i < s.size(); i += change){ 
     s.insert(i, "\n"); 
     i++; 
    } 
} 

Edit: Я не знаю, почему ваш пост был отвергнут, я до голосовала.

0

Может быть, не самый быстрый, но работа:

void addNewLinesToString (std::string* txt, int limit) 
{ 
    if(limit <= 0) 
     return; 
    limit++; 
    for (int i=1; i<=txt->size()/limit; i++) 
      txt->insert((i*limit)-1, "\n"); 
} 
Смежные вопросы