Добавление строки C++

Простой вопрос: если у меня есть строка, и я хочу добавить к ней строки начала и конца (одну в начале, а другую в конце), как лучше всего это сделать? Что-то вроде этого:

std::string tmpstr("some string here");
std::string head("head");
std::string tail("tail");
tmpstr = head + tmpstr + tail;

Есть ли лучший способ сделать это?

Заранее спасибо.


person Andrew    schedule 16.08.2009    source источник
comment
Результат operator+() всегда является временным (rvalue). При отсутствии ссылок на значение rvalue C++1x, если вам не нужно дополнительно изменять результат, вы, вероятно, можете оптимизировать одно лишнее копирование, сохранив результат в константной ссылке вместо того, чтобы копировать его в объект: const T& result = a + b; Это привяжет временный для ссылки и соответственно продлить срок его службы. Хотя ваш компилятор может оптимизировать эту копию в любом случае (я бы сказал, что маловероятно со строками), так что вы можете ничего не выиграть, использование этого метода не повредит производительности.   -  person sbi    schedule 17.08.2009


Ответы (2)


Если вы беспокоитесь об эффективности и хотите избежать временных копий, сделанных оператором +, вы можете сделать:

tmpstr.insert(0, head);
tmpstr.append(tail);

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

tmpstr.reserve(head.size() + tmpstr.size() + tail.size());

перед выполнением вставки/добавления, чтобы гарантировать, что любое перераспределение происходит только один раз.

Однако ваш исходный код прост и легко читается. Иногда это «лучше», чем более эффективное, но трудночитаемое решение.

person TheUndeadFish    schedule 16.08.2009
comment
проверил профайлером. зависит от компилятора, но в моем случае этот подход гораздо эффективнее. - person Andrew; 17.08.2009

Совсем другой подход:

#include <iostream>
#include <string>
#include <sstream>

int
main()
{
  std::string tmpstr("some string here");
  std::ostringstream out;
  out << head << tmpstr << tail;
  tmpstr = out.str(); // "headsome string heretail"

  return 0;
}

Преимущество этого подхода в том, что вы можете смешать любой тип, для которого оператор ‹‹ перегружен, и поместить их в строку.

  std::string tmpstr("some string here");
  std::ostringstream out;
  int head = tmpstr.length();
  char sep = ',';
  out << head << sep << tmpstr;
  tmpstr = out.str(); // "16,some string here"
person Vijay Mathew    schedule 16.08.2009