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

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

Я читал " Ускоренный" C++ и должен сказать, что это интересная книга.

В главе 6 я должен использовать функцию из <алгоритма>, чтобы объединить вектор <string> в одну строку. Я мог бы использовать накопление, но это не помогает, потому что строковые контейнеры могут только символы push_back.

int main () {
  using namespace std;
  string str = "Hello, world!";
  vector<string>  vec (10, str);
  // Concatenate here?

  return 0;
}

Как мне соединить струны вместе?

4b9b3361

Ответ 1

Предполагая, что это вопрос 6.8, он не говорит, что вы должны использовать накопление - он говорит, что используйте "алгоритм библиотеки". Тем не менее, вы можете использовать накопить:

#include <numeric>

int main () {
    std::string str = "Hello World!";
    std::vector<std::string> vec(10,str);
    std::string a = std::accumulate(vec.begin(), vec.end(), std::string(""));
    std::cout << a << std::endl;
}

Все, что делает накопление, это устанавливает 'sum' для третьего параметра, а затем для всех значений 'val' от первого параметра до второго параметра делает:

sum = sum + val

затем он возвращает "сумму". Несмотря на то, что накопление объявлено в <numeric> оно будет работать для всего, что реализует operator+()

Ответ 2

Как насчет std:: copy?

std::ostringstream os;
std::copy( vec_strings.begin(), vec_string.end(), ostream_iterator<string>( os ) );
cout << os.str() << endl;

Ответ 3

Следующий фрагмент кода компилируется в Visual C++ 2012 и использует лямбда-функцию:

int main () {
    string str = "Hello World!";
    vector<string>  vec (10,str);

    stringstream ss;
    for_each(vec.begin(), vec.end(), [&ss] (const string& s) { cat(ss, s); });

    cout << ss.str() << endl;
}

Пример accumulate в 1-м ответе изящен, но, как указывает sellibitze, он перераспределяется с каждой конкатенацией и масштабируется в O (N²). Этот фрагмент for_each масштабируется примерно до O (N). Я профилировал оба решения со 100К строк; accumulate пример взял 23,6 секунд, но это for_each сниппет принял 0,054 сек.

Ответ 4

Я не уверен в твоем вопросе. В чём проблема? Это просто вопрос цикла.

#include<vector>
#include<string>
#include<iostream>

int main () 
{
    std::string str = "Hello World!";
    std::vector<string>  vec (10,str);

    for(size_t i=0;i!=vec.size();++i)
        str=str+vec[i];
    std::cout<<str;
}

РЕДАКТИРОВАТЬ:

Используйте for_each() из <algorithm>

Попробуйте следующее:

#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
string i;
void func(string &k)
{
  i+=k;
}
int main () {
    string str = "Hello World!";
    vector<string>  vec (10,str);

    for_each(vec.begin(),vec.end(),func);
    cout<<i;
    return 0;
  }