vector同士の連結は? – プログラミング – Home

通知
すべてクリア

[解決済] vector同士の連結は?


悠
 悠
(@悠)
ゲスト
結合: 17年前
投稿: 40
Topic starter  

タイトル通りなのですが…。

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);
 }
}


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

void VectorAdd(std::vector<int> & dst, std::vector<int> & src)
{
dst.insert(dst.end(), src.begin(), src.end());
}


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

vectorにはinsertというメンバ関数があるので,
vOut.insert(vOut.end(), vAAA.begin(), vAAA.end());
とやれば,VectorAdd関数は不要になりますね。


返信引用
悠
 悠
(@悠)
ゲスト
結合: 17年前
投稿: 40
Topic starter  

一部訂正します、済みません。
誤:void VectorAdd(std::vector<char> & dst, std::vector<char> & src)
正:void VectorAdd(std::vector<int> & dst, std::vector<int> & src)

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

おフザケ (^^;

// 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] << ' ';
}
}


返信引用
悠
 悠
(@悠)
ゲスト
結合: 17年前
投稿: 40
Topic starter  

επιστημηさん…。

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

 が!!

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

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

え? stringは'\0'で切れたりしませんよ?


返信引用
悠
 悠
(@悠)
ゲスト
結合: 17年前
投稿: 40
Topic starter  

…え。。
済みません、再度調べ直します。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

#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]);
}

}


返信引用
悠
 悠
(@悠)
ゲスト
結合: 17年前
投稿: 40
Topic starter  

ごめんなさい。
std::basic_stringとstd::stringをごっちゃにしてました。
済みません。 orz


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

どっちも切れませんて。
typedef basic_string<char> string;
なんだから。


返信引用
悠
 悠
(@悠)
ゲスト
結合: 17年前
投稿: 40
Topic starter  

あ…そうでした<typedef
お騒がせ致しました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました