タイトル通りなのですが…。
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);
}
}
void VectorAdd(std::vector<int> & dst, std::vector<int> & src)
{
dst.insert(dst.end(), src.begin(), src.end());
}
vectorにはinsertというメンバ関数があるので,
vOut.insert(vOut.end(), vAAA.begin(), vAAA.end());
とやれば,VectorAdd関数は不要になりますね。
一部訂正します、済みません。
誤:void VectorAdd(std::vector<char> & dst, std::vector<char> & src)
正:void VectorAdd(std::vector<int> & dst, std::vector<int> & src)
ありがとうございます、επιστημηさん、YuOさん。
>vectorにはinsertというメンバ関数があるので…
あーなるほど。。
insertを使用するのですね、ありがとうございます。
おフザケ (^^;
// 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] << ' ';
}
}
επιστημηさん…。
実は自分も最初は楽したい為にbasic_stringを用いておりました。
が!!
NULL(0x00)の時点で本来必要な情報が途中でぶち切れる事に気づき。。
#上記の例では、vAAAの一番最初のデータですね。
慌てて、vectorにしたのでした(^-^;;;
え? stringは'\0'で切れたりしませんよ?
…え。。
済みません、再度調べ直します。
#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]);
}
}
ごめんなさい。
std::basic_stringとstd::stringをごっちゃにしてました。
済みません。 orz
どっちも切れませんて。
typedef basic_string<char> string;
なんだから。
あ…そうでした<typedef
お騒がせ致しました。