○vector配列(動的配列)
#include <vector> 必要なヘッダファイル.
vector<TYPE> data; TYPE型の可変長配列 data[] の宣言
data.push_back(x) data[]の最後尾にxというデータを付け足す.
data.size() data[]の配列サイズを返す関数.
data[N] 配列name[ ]のN番目のデータ.
data.max_size() 最大サイズを返す。
(注意)new した領域を内部に抱え込んでいるオブジェクトを vector の要素として扱う場合では、
vector を破棄してもその要素 (ポインタ) の指している先のオブジェクトまでは破棄されないので、
何か明示的に破棄するコードが必要になってきます。
//VCでの警告を抑制
#pragma warning( disable : 4786 )
**********************************************************************
#include <stdio.h>
#include <vector>
int main(){
std::vector<char*> data;
data.push_back("aa");
data.push_back("bb");
data.push_back("cc");
int c=data.size();
for(int i=0;i<c;i++)
printf("%s\n",data[i]);
return 0;
}
○結果
aa
bb
cc
(intの例)-----------------------------------------------------------
#include <vector>
std::vector<int> data;
data.push_back(0);
data.push_back(1);
data.push_back(2);
data.push_back(3);
data.push_back(4);
int c=data.size();
data[0]=100;
printf("サイズは%d\n",c);
printf("%d\n",data[0]);
printf("%d\n",data[1]);
printf("%d\n",data[2]);
printf("%d\n",data[3]);
printf("%d\n",data[4]);
○結果
サイズは5
100
1
2
3
4
(CStringの例)---------------------------------------------------------
std::vector<CString> data;
data.push_back("0です");
data.push_back("1です");
data.push_back("2です");
data.push_back("3です");
data.push_back("4です");
int c=data.size();
data[0]="テストです。";
printf("サイズは%d\n",c);
printf("%s\n",data[0]);
printf("%sd\n",data[1]);
printf("%sd\n",data[2]);
printf("%sd\n",data[3]);
printf("%sd\n",data[4]);
○結果
サイズは5
テストです。
1ですd
2ですd
3ですd
4ですd
(バッファーとして使う場合)------------------------------------------
std::vector<T> の内部にあるメモリは連続していますから、次のようなことが可能です。
std::vector<char> data;
data.push_back('i');
data.push_back('n');
data.push_back('a');
data.push_back('b');
data.push_back('a');
data.push_back('\0');
char* str=&data[0];
printf("%s\n",str);
○結果
inaba
■追記 ------------------------------------------
▼char*型は、内部ではポインタとして扱われるため注意が必要です
#include <stdio.h>
#include <string.h>
#include <vector>
int main(){
char buff[128];
std::vector<char*> data;
strcpy(buff,"aa");
data.push_back(buff);
strcpy(buff,"bb");
data.push_back(buff);
strcpy(buff,"cc");
data.push_back(buff);
int c=data.size();
for(int i=0;i<c;i++)
printf("%s\n",data[i]);
return 0;
}
○結果
cc
cc
cc
▼std::string型ならば大丈夫みたいです
#include <stdio.h>
#include <string.h>
#include <string>
#include <vector>
int main(){
char buff[128];
std::vector<std::string> data;
std::string str;
strcpy(buff,"aa");
str=buff;
data.push_back(str);
strcpy(buff,"bb");
str=buff;
data.push_back(str);
strcpy(buff,"cc");
str=buff;
data.push_back(str);
int c=data.size();
for(int i=0;i<c;i++)
printf("%s\n",(char*)data[i].c_str());
return 0;
}
○結果
aa
bb
cc
クラスを入れる---------------------------------------------
複製されるため問題ないみたいです
#include <stdio.h>
#include <string.h>
#include <vector>
class cell{
public:
char str[128];
void show(void){
printf("%s\n",str);
}
};
int main(){
std::vector<cell> data;
cell st;
strcpy(st.str,"aa");
data.push_back(st);
strcpy(st.str,"bb");
data.push_back(st);
strcpy(st.str,"cc");
data.push_back(st);
int c=data.size();
for(int i=0;i<c;i++)
((cell)data[i]).show();
return 0;
}
○結果
aa
bb
cc
エラー---------------------------------------------
メモリーが確保できなかった場合など、エラーが送出されます
#include <stdio.h>
#include <vector>
int main(){
try{
//失敗するほどの多量のメモリを確保
std::vector<int> data(0xFFFFFFFF);
}catch (...){
printf("%s\n","ERR");
}
return 0;
}
○結果
ERR
▲トップページ
>
Windows と C++