STLでvectorおよびfor_eachのいくつかの使い方

1990 ワード

/*
 * vector_test.cpp
 *
 *  Created on: 2015-3-22
 *      Author: gino
 */




#include 
#include 
#include 
using namespace std;


void printElem(int num){

	cout << num << " ";
}

class myclass{
public:
	void operator()(int i){
		cout << i << " " ;
	}

};
int main(){
	vector v1;
	myclass myobject;
	//append
	v1.push_back(12);
	v1.push_back(16);
	v1.push_back(18);

	cout << v1[2] << endl;
	cout << *(v1.begin() + 1) << endl;

	v1[0] += 23;
	cout << v1[0] <::iterator it = v1.begin();
	cout << *it << endl;

	v1.push_back(99);
	v1.push_back(108);

	cout << *it << endl; //  

	//insert
	v1.insert(v1.begin()+2,123);
	//for_each
	for_each(v1.begin(),v1.end(),printElem);
	cout << endl;
	for_each(v1.begin(),v1.end(),myclass());
	cout << endl;
	for_each(v1.begin(),v1.end(),myobject);
	cout << endl;
	for_each(v1.begin(),v1.end(),[](int value){cout << value << " ";});
	cout << endl;
	v1.erase(v1.end() -2);
	for_each(v1.begin(),v1.end(),[](int value){cout << value << " ";});
}

まとめ:
vector反復器の失効:要素を挿入すると、その事前割り当て空間が足りない場合、新しい空間を再申請し、元の空間の要素を新しい空間にコピーし、新しい要素を新しい空間の末尾に配置して、vector要素の連続保存の目的を満たします.正しい方法はvector容量を超えた後、反復器をもう一度取り直すことです.
for_each : STL for_each関数はヘッダファイルに定義され、関数のプロトタイプは以下の通りです.
template
_Fn1 for_each(InIt _First, InIt _Last, _Fn1 _Func){
        //perform function for each element
        for( ; _First != _Last; ++_First)
               _Func(*_First); //Note!
        return (_Func);
}

1番目のパラメータと2番目のパラメータは区間を表し、for_each関数ループ区間の要素を3番目のパラメータ(関数オブジェクトor関数名or匿名関数)に渡す
匿名関数はC++11の標準ですので、コンパイル時に-std=c++0 xまたは-std=gnu++0 xオプションを追加する必要があります