Каков наиболее эффективный способ добавления std::string
? Стоит ли написать целую функцию, чтобы сделать это, или это займет всего 1 - 2 линии? Я не вижу ничего связанного с std::string::push_front
.
Prepend std::string
Ответ 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");
Вы должны заметить, что это довольно неэффективно, чтобы сделать выше.