xxxxプログラマのメモ

先人に感謝と敬意:自分の困ったこと調べたことのメモ

C++11

よく出来る人からC++11 についても知っておくべし、とのことだったので。

www.slideshare.net

全て資料からの引用です。

auto の活用

//C++98
vector<int>::iterator i = max_element(v.begin(),v.end()); 
map<string,pair<int,string>>::iterator k = m.find("key"); 

//C++11
const auto x = 5; // const int vector<vector<int>> vv(10); 
auto a = vv[0]; // vector<int> 
auto& b = vv[0]; // vector<int>& 
const auto& c = vv[0]; // const vector<int>&


ラムダ式

size_t x = count_if(v.begin(),v.end(), [](int n){ return n%2==0; }); 

//[] () ->T {} で構成される 
//[] キャプチャリスト 
//() 引数 
//->T 戻り値の型(省略可) 
{} 関数の本体

const int ar[4] = { 1, 2, 3, 4 }; 
const int x = 10; 
for_each(begin(ar),end(ar), 
      [=](int n){ cout << n*x << ' '; }); 

// [=] により、ラムダ式内の x は 
// 外部からコピーキャプチャ 
// 10 20 30 40

const int ar[4] = { 1, 2, 3, 4 }; 
int sum = 0; 
for_each(begin(ar),end(ar), 
      [&](int n){ sum += n; }); 

// [&] により、ラムダ式内の sum は 
// 外部から参照キャプチャ 

vector<Vec2> pts; 
// 原点に近い順にソート 
sort(pts.begin(),pts.end(), 
  [](const Vec2& a, const Vec2& b) 
{ 
return a.lengthSq()<b.lengthSq(); 
} ); 

vector<Enemy> enemies; 
int threshold = 20; 

// HP が threshold 未満の敵を削除 

enemies.erase(
 remove_if( 
  enemies.begin(),enemies.end(), 
   [=](const Enemy& enemy) 
   { 
    return enemy.hp < threshold; 
   }
  ), 
 enemies.end() 
);

qiita.com



Thanks!