Как добавить много строк в C ++ - PullRequest
10 голосов
/ 20 февраля 2010

Поскольку я знаю, что C ++ позволяет добавлять только 2 строки вместе, т.е. s = s1 + s2

Но как я могу добавить много строк вместе? Как:

s = s1 + s2 + s3 + s4 + ... + sn

Ответы [ 6 ]

11 голосов
/ 20 февраля 2010

Если вы пытаетесь добавить строковые объекты класса std :: string, это должно сработать.

string s1 = "string1";
string s2 = "string2";
string s3 = "string3";

string s = s1 + s2 + s3;

OR

string s = string("s1") + string("s2") + string("s3") ...
7 голосов
/ 20 февраля 2010

Прежде всего, вы можете сделать вещь + sn просто отлично. Хотя это займет экспоненциальное квадратичное (см. Комментарии) время, если вы используете std::basic_string<t> строки на C ++ 03.

Вы можете использовать std::basic_string<t>::append совместно с std::basic_string<t>::reserve, чтобы объединить вашу строку за O (n) раз.

РЕДАКТИРОВАТЬ: например

string a;
//either
a.append(s1).append(s2).append(s3);
//or
a.append("I'm a string!").append("I am another string!");
5 голосов
/ 20 февраля 2010
s = s1 + s2 + s3 + .. + sn;

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

string tmp1 = s1 + s2;
string tmp2 = tmp1 + s3;
string tmp3 = tmp2 + s4;
...
s = tmpn + sn;

Альтернативный способ, который гарантированно не создает временные файлы:

s = s1;
s += s2;
s += s3;
...
s += sn;
3 голосов
/ 20 февраля 2010

std::ostringstream построен для этого, см. Пример здесь . Это просто:

std::ostringstream out;
out << "a" << "b" << "c" << .... << "z";
std::string str( out.str());
1 голос
/ 18 марта 2016

Использование шаблона для добавления строк, символов * и символов для формирования строки

StrLen: -

#include <iostream>
#include <cstring>

// it_pair to wrap a pair of iterators for a for(:) loop
template<typename IT> 
class it_pair
    {
    IT b;
    IT e;
public:
    auto begin() const
        {
        return b;
        }
    auto end() const
        {
        return e;
        }
    };

// string length
template<typename S> auto strlen(const S& s) -> decltype(s.size())
    {
    return s.size();
    }

auto strlen(char c) -> size_t
    {
    return 1u;
    }

auto strlen(const std::initializer_list<char>& il) -> size_t
    {
    return il.size();
    }

template<typename IT>
auto strlen(const it_pair<IT>& p)
    {
    auto len = size_t{};
    for(const auto& s:p)
        len += strlen(s);
    return len;
    }

template<typename S, typename ...SS> auto strlen(S s, SS&... ss) -> size_t
    {
    return strlen(s) + strlen(ss...);
    }

добавление строк

// terminate recursion
template<typename TA, typename TB>
void append(TA& a, TB& b)
    {
    a.append(b);
    }

// special case for a character
template<>
void append<std::string, const char>(std::string& a, const char& b)
    {
    a.append(1, b);
    }

// special case for a collection of strings
template<typename TA, typename TB>
void append(TA& a, const it_pair<TB>& p)
    {
    for(const auto& x: p)
        a.append(x);
    }

// recursion append
template<typename TA, typename TB, typename ...TT>
void append(TA& a, TB& b, TT&... tt)
    {
    append(a, b);
    append(a, tt...);
    }

template<typename ...TT>
std::string string_add(const TT& ... tt)
    {
    std::string s;
    s.reserve(strlen(tt...));
    append(s, tt...);
    return s;
    }

template<typename IT>
auto make_it_pair(IT b, IT e)
    {
    return it_pair<IT>{b, e};
    }

template<typename T>
auto make_it_pair(const T& t)
    {
    using namespace std;
    return make_it_pair(cbegin(t), cend(t));
    }

основной пример

int main()
    {
    const char * s[] = {"vw", "xyz"};
    std::vector<std::string> v{"l", "mn", "opqr"};
    std::string a("a");
    std::string b("bc");
    std::string c("def");
    std::cout << string_add(a, b+c, "ghij", make_it_pair(v), 'k', make_it_pair(s));
    }
0 голосов
/ 16 мая 2019

Если вы хотите сделать это

  • Эффективно , т. Е. Без учета квадратичного времени
  • Без перезаписи исходной переменной
  • Без создания временных переменных

Тогда это сделает работу

auto s = std::string(s1).append(s2).append(s3).append(sn);  

А если вам нравятся вещи, отформатированные

auto s = std::string(s1).append(s2)
                        .append(s3)
                        .append(sn)
...