vector同士の連結は?

[戻る]
2008/02/28(木) 09:57:40
タイトル通りなのですが…。

STLのvector同士を連結する為に以下のサブルーチンを作成しました。
これでも連結し終わったvectorの書き出しは随分早いのですが、
これよりもスマートな方法をご教示願います。

#define vSIZE (10)

void VectorAdd(std::vector<char> & dst, std::vector<char> & src)
{
 std::vector<char>::iterator srcPos = src.begin();

 for( ; srcPos != src.end(); srcPos++) {
  dst.push_back(*(srcPos));
 }
}

void Writevector(FILE* ofp)
{

 std::vector<int> vAAA;
 std::vector<int> vBBB;
 std::vector<int> vCCC;
 std::vector<int> vDDD;

 // データをセットする
 for(unsigned int i = 0; i < vSIZE; i++) {
  vAAA.push_back(vSize * 0 + i);
  vBBB.push_back(vSize * 1 + i);
  vCCC.push_back(vSize * 2 + i);
  vDDD.push_back(vSize * 3 + i);
 }

 // 各vector(ヘッダ)をひとつのvectorに情報をまとめて…
 std::vector<char> vOut;
 VectorAdd(vOut, vAAA);
 VectorAdd(vOut, vBBB);
 VectorAdd(vOut, vCCC);
 VectorAdd(vOut, vDDD);

 // 一気にヘッダの部分書き出しを行う
 FILE* fp;
 fp = fopen("c:\\tmp.txt", "wt");
 if (fp != NULL) {
  fwrite(&vOut.front(),sizeof(char), vOut.size(), ofp);
  fclose(fp);
 }
}

επιστημη [HomePage] 2008/02/28(木) 10:06:39
void VectorAdd(std::vector<int> & dst, std::vector<int> & src)
{
  dst.insert(dst.end(), src.begin(), src.end());
}

YuO [E-Mail] 2008/02/28(木) 10:10:15
vectorにはinsertというメンバ関数があるので,
vOut.insert(vOut.end(), vAAA.begin(), vAAA.end());
とやれば,VectorAdd関数は不要になりますね。

2008/02/28(木) 10:15:25
[[解決]]
一部訂正します、済みません。
誤:void VectorAdd(std::vector<char> & dst, std::vector<char> & src)
正:void VectorAdd(std::vector<int> & dst, std::vector<int> & src)

ありがとうございます、επιστημηさん、YuOさん。
>vectorにはinsertというメンバ関数があるので…
あーなるほど。。
insertを使用するのですね、ありがとうございます。

επιστημη [HomePage] 2008/02/28(木) 10:23:02
おフザケ (^^;

// basic_stringをvectorがわりに使っちまう

#include <iostream>
#include <string>

int main() {

  const int vSIZE = 10;

  std::basic_string<int> vAAA;
  std::basic_string<int> vBBB;
  std::basic_string<int> vCCC;
  std::basic_string<int> vDDD;

  // データをセットする
  for(unsigned int i = 0; i < vSIZE; i++) {
    vAAA += (vSIZE * 0 + i);
    vBBB += (vSIZE * 1 + i);
    vCCC += (vSIZE * 2 + i);
    vDDD += (vSIZE * 3 + i);
  }

  // 各vector(ヘッダ)をひとつのvectorに情報をまとめて…
  std::basic_string<int> vOut = vAAA + vBBB + vCCC + vDDD;

  for ( int i = 0; i < vOut.size(); ++i ) {
    std::cout << vOut[i] << ' ';
  }
}

2008/02/28(木) 10:39:53
επιστημηさん…。

実は自分も最初は"楽したい"為にbasic_stringを用いておりました。

                        が!!

NULL(0x00)の時点で本来必要な情報が途中でぶち切れる事に気づき。。
#上記の例では、vAAAの一番最初のデータですね。

慌てて、vectorにしたのでした(^-^;;;

επιστημη [HomePage] 2008/02/28(木) 10:55:37
え? stringは'\0'で切れたりしませんよ?

2008/02/28(木) 11:04:50
…え。。
済みません、再度調べ直します。

επιστημη [HomePage] 2008/02/28(木) 11:09:26
#include <iostream>
#include <string>

int main() {

  std::string dst("\0abc\0def",8);
  std::string src("\0ghi\0jkl",8);

  dst += src;

  // キレテナーイ♪
  for ( int i = 0; i < dst.size(); ++i ) {
    std::cout << (dst[i] == '\0' ? '-' : dst[i]);
  }

}

2008/02/28(木) 11:11:41
ごめんなさい。
std::basic_stringとstd::stringをごっちゃにしてました。
済みません。 orz

επιστημη [HomePage] 2008/02/28(木) 11:13:29
どっちも切れませんて。
typedef basic_string<char> string;
なんだから。

2008/02/28(木) 11:16:17
あ…そうでした<typedef
お騒がせ致しました。

古いスレッドには追加発言できません。