2015-01-14 4 views
1

Например, следующий код меняет строку, но что происходит, когда я добавляю каждый символ в строку? Это эффективно? Создает ли это новый массив символов каждый раз, или делает это в два раза больше каждый раз, когда он заполняет, или ?:Что происходит, когда вы объединяете символ в строку на C++?

#include <iostream> 
#include <stack> 
using namespace std; 

int main() 
{ 
    string test = "testing"; 

    stack<char> first; 

    for(int i = 0; test[i]; i++) 
    { 
     first.push(test[i]); 
    } 
    string reversed; 
    int i=0; 
    while(!first.empty()) 
    { 
     reversed += first.top(); 
     first.pop(); 
    } 
    cout << test << reversed; 
} 
+1

Почему вы не используете [std :: reverse] (http://en.cppreference.com/w/cpp/algorithm/reverse)? –

+1

Прочтите это сообщение SO, чтобы узнать, как работает 'string' http://stackoverflow.com/questions/1466073/how-is-stdstring-implemented – Ankur

+2

Использование стека не требуется и добавляет ненужную неэффективность. Более эффективным способом было бы преобразование строк (test.rbegin(), test.rend()); '. – juanchopanza

ответ

1

Когда строка добавляется в другую строку, в случае оператора + результирующая строка перемещается по контуру.

String a ("hello"); a + = "goodmorning";

Строка использует буфер буфера внизу, а размер устанавливается на значение по умолчанию во время построения. Вы можете изменить его с помощью резерва. Но во время конкатенации, если зарезервированный размер превышен, буфер необходимо расширить.

1

Да код не является эффективным. Вы должны использовать std::reverse. Но если вы все еще хотите придерживаться своего подхода, используйте std::string::reserve, чтобы увеличить емкость строки.

string reversed; 
reversed.capacity(test.size()); 

При добавлении посимвольно в std::vector и std::string, они изменить размер, когда емкость исчерпывается постоянным множителем. (обычно 2, но могут быть разными)

Этот exponential growth гарантирует, что стоимость вставки будет постоянной асимптотически.

+1

Я предполагаю, что он спрашивает о 'string' библиотеке не об обратном. – Ankur

+0

Извините, я знал, что стек неэффективен, но я в первую очередь интересовался фактической частью конкатенации строки и тем, что происходит, когда вы добавляете символ в строку таким образом. Я понимаю, что есть лучшие реализации обратного и даже одного в стандартной библиотеке, но просто хотел дать простой пример для добавления символов в строку. – user120920

Смежные вопросы