web-dev-qa-db-ja.com

文字列のベクトルを組み合わせる

私は読んでいます 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;
}

文字列を結合するにはどうすればよいですか?

21
Bogdan

これが質問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+()を実装するすべてのものに対して機能します。

53
anon

Std :: copyはどうですか?

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

次のスニペットは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秒かかりました。

9
pixelgrease

あなたの質問についてはよくわかりませんが、どこに問題がありますか?それはループの問題です。

_#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;
  }
_
5
Prasoon Saurav