Publicidad
Publicidad

Más contenido relacionado

Publicidad

Último(20)

Publicidad

ぱっと見でわかるC++11

  1. パッと見でわかる C++11 わんくま同盟茶藝部顧問 episthmh episteme@cppll.jp プログラミング生放送勉強会 第17回@品川
  2. episthmhて何者ぞ • C++界隈ではちったー名の知れたソフト屋 • Microsot MVP for Visual C++ 2004~ • モノ書き? DDJJ, C-Magazine… CodeZine • 書籍いくつか プログラミング生放送勉強会 第17回@品川
  3. Visual Studio (VC++) と C++11 • Visual Studio 2010 は – C++11 の”いくつか”をサポート • Visual Studio 2012 では – 言語レベルでの強化 と – ライブラリ追加 によって – より C++11 に迫っています – “フルコンプ”じゃないけどね プログラミング生放送勉強会 第17回@品川
  4. array<T,N> int data[N] = { 1, 2, 3 }; for_each( data, data+N, … ); array<int,N> data = { 1, 2, 3 }; for_each( data.begin(), data.end(), … ); begin(), end(), size() などなど、 container系メンバ関数が使えます。 プログラミング生放送勉強会 第17回@品川
  5. begin(), end() vector<int> v; int a[N] ; for_each( v.begin(), v.end(), … ); for_each( a, a+N, …) vector<int> v; int a[N]; for_each( begin(v), end(v), … ); for_each( begin(a), end(a), …); containerと思しきもののアタマとケツは、 begin()/end() で統一できます。 プログラミング生放送勉強会 第17回@品川
  6. auto vector<int> v; for ( vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter ) { cout << *iter << endl; } vector<int> v; for ( auto iter = v.begin(); iter != v.end(); ++iter ) { cout << *iter << endl; } 「型推論」 ずっと欲しかった機能。 プログラミング生放送勉強会 第17回@品川
  7. range-based for vector<int> v; for ( vector<int>::iterator iter = v.begin(); iter != v.end(); ++iter ) { cout << *iter << endl; } vector<int> v; vector<int> v; for ( int item : v ) { for ( auto item : v ) { cout << item << endl; cout << item << endl; } } begin(), end() が適用できるcontainerと思しきもの であれば、range-based for が使えます。 プログラミング生放送勉強会 第17回@品川
  8. foreach(.NET) にはできないこと vector<int> v; vector<int> v; for ( int& item : v ) { for ( auto& item : v ) { ++item; ++item; } } 「参照」できちゃうですね♪ プログラミング生放送勉強会 第17回@品川
  9. lambda式 void print_int(int item) { cout << item << endl; } … vector<int> v; for_each( v.begin(), v.end(), print_int); vector<int> v; for_each( v.begin(), v.end(), [](int item) { cout << item << endl; } ); 関数オブジェクトをその場で定義しちゃうです。 プログラミング生放送勉強会 第17回@品川
  10. stateless-lambdaは関数ポインタに暗黙変換できる int main() { const int N = 10; int data[N] = { 9, 7, 5, 3, 1, 0, 2, 4, 6, 8 }; // qsortの比較関数にlambdaをねじ込む qsort(data, N, sizeof(int), [](const void* x, const void* y)->int { return *static_cast<const int*>(x) - *static_cast<const int*>(y);} ); for ( auto item : data ) {cout << item << ' '; } cout << endl; } stateless-lambda: なにもキャプチャしないlambda プログラミング生放送勉強会 第17回@品川
  11. stateless-lambdaは関数ポインタに暗黙変換できる wcout.imbue(locale("japanese")); // EnumWindows に与える CALLBACK に stateless lambda を。 EnumWindows( [](HWND hWnd, LPARAM lParam)->BOOL { TCHAR buf[256]; GetWindowText(hWnd, buf, 256); if ( buf[0] != L'0' ) { *reinterpret_cast<wostream*>(lParam) << buf << endl; } return TRUE; }, reinterpret_cast<LPARAM>(&wcout)); __cdecl, __stdcall のどちらにも使えます。 プログラミング生放送勉強会 第17回@品川
  12. Win-API によるスレッド // スレッド本体 int plus(int x, int y) { return x + y; } // Win32 thread のためのwrapper typedef tuple<int,int,int> thread_io; DWORD WINAPI plus_entry(LPVOID argv) { thread_io* io = static_cast<thread_io*>(argv); get<2>(*io) = plus(get<0>(*io),get<1>(*io)); return 0; } int main() { HANDLE handle; thread_io pio(1,2,0); handle = CreateThread(NULL, 0, &plus_entry, &pio, 0, NULL); WaitForSingleObject(handle, INFINITE); CloseHandle(handle); cout << get<2>(pio) << endl; } 従来のスレッドは wrapper を必要とし ます プログラミング生放送勉強会 第17回@品川
  13. <thread> #include <iostream> #include <thread> using namespace std; int plus_int(int x, int y) { return x + y; } int main() { int result; thread thr([&](int x, int y) { result = plus_int(x,y);}, 1, 2); thr.join(); cout << result << endl; } コンストラクタに与えた関数オブジェ クトを スレッドで実行します。 プログラミング生放送勉強会 第17回@品川
  14. <future> #include <iostream> #include <future> using namespace std; int plus_int(int x, int y) { return x + y; } int main() { future<int> f = async(plus_int, 1, 2); cout << f.get() << endl; } asyncでスレッドを生成/実行 し、 futureでその結果を受け取りま す。 プログラミング生放送勉強会 第17回@品川
  15. <mutex> #include <mutex> … mutex mtx; int balance = 0; void plus_int(int x) { lock_guard<mutex> guard(mtx); balance += x; } int main() { thread thr_inc([&](int n) { while ( n-- ) plus_int( 1);}, 1000000); thread thr_dec([&](int n) { while ( n-- ) plus_int(-1);}, 1000000); thr_inc.join(); thr_dec.join(); cout << balance << endl; } Win-API の CriticalSection 相当。 プログラミング生放送勉強会 第17回@品川
  16. <atomic> #include <thread> #include <atomic> using namespace std; int main() { atomic<int> balance = 0; thread thr_inc([&](int n) { while ( n-- ) ++balance; } , 1000000); thread thr_dec([&](int n) { while ( n-- ) --balance; } , 1000000); thr_inc.join(); thr_dec.join(); cout << balance << endl; } Win-API の InterlockedXXX 相 当。 プログラミング生放送勉強会 第17回@品川
Publicidad