Подтвердить что ты не робот

Prepend std::string

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

4b9b3361

Ответ 1

На самом деле существует аналогичная функция с несуществующим 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, который выделяет большой буфер и помещает первое содержимое в центр этого буфера памяти.

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


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

Ответ 2

myString.insert(0, otherString);

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

Таким образом, оба этих файла.

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

Ответ 3

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

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

Ответ 4

Если вы используете 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;

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

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

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