Prepend std :: string - PullRequest
       15

Prepend std :: string

48 голосов
/ 12 декабря 2011

Какой самый эффективный способ пополнить std::string?Стоит ли писать для этого целую функцию или она займет всего 1 - 2 строки?Я не вижу ничего, связанного с std::string::push_front.

Ответы [ 4 ]

70 голосов
/ 12 декабря 2011

На самом деле есть функция, аналогичная несуществующей std::string::push_front, см. Пример ниже.


Документация по std :: string :: insert

#include <iostream>
#include <string>

int
main (int argc, char *argv[])
{
  std::string s1 (" world");
  std::string s2 ("ello");

  s1.insert (0,     s2); // insert the contents of s2 at offset 0 in s1
  s1.insert (0, 1, 'h'); // insert one (1) 'h'        at offset 0 in s1

  std::cout << s1 << std::endl;
}

вывод:

hello world

Поскольку добавление строки с данными может потребовать как перераспределения, так и копирования / перемещения существующих данных, вы можете получить некоторые преимущества в производительности, избавившись от части перераспределенияс помощью std::string::reserve (чтобы выделить больше памяти перед рукой).

К сожалению, копирование / перемещение данных неизбежно, если только вы не определите свой собственный класс, который действует как std::string, который выделяет большой буфери помещает первый контент в центр этого буфера памяти.

Затем вы можете как добавлять, так и добавлять данные без перераспределения и перемещения данных, если буфер достаточно большой, то есть.Копирование из источника в места назначения , очевидно, все еще необходимо.


Если у вас есть буфер, в котором вы знаете, вы prepend данных чаще, чем вы добавьте хорошая альтернатива - хранить строку в обратном направлении и при необходимости переворачивать ее (если это случается реже).

6 голосов
/ 27 января 2014
myString.insert(0, otherString);

Пусть авторы Стандартной библиотеки шаблонов беспокоятся об эффективности;использовать все свои часы работы вместо того, чтобы перепрограммировать колесо.

Таким образом, оба эти варианта будут.

Пока продуманная вами реализация STL была продумана, выиметь эффективный код.Если вы используете плохо написанный STL, у вас все равно будут большие проблемы:)

4 голосов
/ 12 декабря 2011

Если вы используете std::string::append, вы должны понимать, что следующее эквивалентно:

std::string lhs1 = "hello ";
std::string lh2 = "hello ";
std::string rhs = "world!";

lhs1.append(rhs);
lhs2 += rhs; // equivalent to above
// Also the same:
// lhs2 = lhs + rhs;

Аналогично, «prepend» будет эквивалентен следующему:

std::string result = "world";
result = "hello " + result;
// If prepend existed, this would be equivalent to
// result.prepend("hello");

Вы должны заметить, что делать это выше неэффективно.

3 голосов
/ 12 декабря 2011

Перегружен string operator+ (char lhs, const string& rhs);, поэтому вы можете просто your_string 'a' + your_string подражать push_front.

Это не на месте, но создает новую строку, поэтому не ожидайте, что она будет эффективной. Для (возможно) более эффективного решения используйте resize, чтобы собрать пробел, std::copy_backward, чтобы сдвинуть всю строку назад на единицу и вставить новый символ в начале.

...