○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++