Оптимальный метод создания большой строки, содержащей несколько переменных?

StackOverflow https://stackoverflow.com/questions/2083200

Вопрос

Я хочу создать строку, содержащую множество переменных:

std::string name1 = "Frank";
std::string name2 = "Joe";
std::string name3 = "Nancy";
std::string name4 = "Sherlock";

std::string sentence;

sentence =   name1 + " and " + name2 + " sat down with " + name3;
sentence += " to play cards, while " + name4 + " played the violin.";

Это должно привести к предложению, которое гласит

Фрэнк и Джо сели с Нэнси играть в карты, в то время как Шерлок играл на скрипке.

Мой вопрос заключается в следующем:Каков оптимальный способ добиться этого?Я обеспокоен тем, что постоянное использование оператора + неэффективно.Есть ли лучший способ?

Это было полезно?

Решение

ДА, std::stringstream, например:

#include <sstream>
...

std::string name1 = "Frank";
std::string name2 = "Joe";
std::string name3 = "Nancy";
std::string name4 = "Sherlock";

std::ostringstream stream;
stream << name1 << " and " << name2 << " sat down with " << name3;
stream << " to play cards, while " << name4 << " played the violin.";

std::string sentence = stream.str();

Другие советы

Для этого вы могли бы использовать boost::format:

http://www.boost.org/doc/libs/1_41_0/libs/format/index.html

std::string result = boost::str(
    boost::format("%s and %s sat down with %s, to play cards, while %s played the violin")
      % name1 % name2 % name3 %name4
)

Это очень простой пример того, что может сделать boost::format, это очень мощная библиотека.

Вы можете вызывать функции-члены, такие как operator+= о временных.К сожалению, у него неправильная ассоциативность, но мы можем исправить это с помощью круглых скобок.

std::string sentence(((((((name1  +  " and ")
                        += name2) += " sat down with ")
                        += name3) += " to play cards, while ")
                        += name4) += " played the violin.");

Это немного некрасиво, но это не связано с какими-либо ненужными временными затратами.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top