私は読んでいます Accelerated C++ そしてそれは面白い本だと言わざるを得ません。
第6章では、<algorithm>の関数を使用して、vector <string>から単一の文字列に連結する必要があります。 Accumulateを使用することもできますが、文字列コンテナーはPush_back文字しか使用できないため、役に立ちません。
int main () {
using namespace std;
string str = "Hello, world!";
vector<string> vec (10, str);
// Concatenate here?
return 0;
}
文字列を結合するにはどうすればよいですか?
これが質問6.8であると仮定すると、accumulateを使用する必要があるとは言われていません。「ライブラリアルゴリズム」を使用すると書かれています。ただし、accumulateを使用できます。
_#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」を3番目のパラメーターに設定することだけです。次に、最初のパラメーターから2番目のパラメーターまでのすべての値「val」に対して次のようにします。
_sum = sum + val
_
次に、「sum」を返します。 Accumulateが_<numeric>
_で宣言されているという事実にもかかわらず、それはoperator+()
を実装するすべてのものに対して機能します。
Std :: copyはどうですか?
std::ostringstream os;
std::copy( vec_strings.begin(), vec_string.end(), ostream_iterator<string>( os ) );
cout << os.str() << endl;
次のスニペットはVisualC++ 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
の例はエレガントですが、 sellibitze が指摘しているように、連結ごとに再割り当てされ、O(N²)でスケーリングされます。この for_each
スニペットは約O(N)でスケーリングします。私は両方のソリューションを100Kの文字列でプロファイリングしました。 accumulate
の例は23.6秒かかりましたが、このfor_each
スニペットは0.054秒かかりました。
あなたの質問についてはよくわかりませんが、どこに問題がありますか?それはループの問題です。
_#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;
}
_
編集:
_<algorithm>
_からfor_each()
を使用します
これを試して:
_#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;
}
_