Объединение вектора строк
Я читал " Ускоренный" C++ и должен сказать, что это интересная книга.
В главе 6 я должен использовать функцию из <алгоритма>, чтобы объединить вектор <string> в одну строку. Я мог бы использовать накопление, но это не помогает, потому что строковые контейнеры могут только символы push_back.
int main () {
using namespace std;
string str = "Hello, world!";
vector<string> vec (10, str);
// Concatenate here?
return 0;
}
Как мне соединить струны вместе?
Ответы
Ответ 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;
}