STLでvectorおよびfor_eachのいくつかの使い方
/*
* 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オプションを追加する必要があります