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

1,768 views
1,691 views

Published on

Published in: Technology, Business
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,768
On SlideShare
0
From Embeds
0
Number of Embeds
23
Actions
Shares
0
Downloads
10
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

  1. 1. パッと見でわかる C++11 わんくま同盟茶藝部顧問 episthmh episteme@cppll.jpプログラミング生放送勉強会 第17回@品川
  2. 2. episthmhて何者ぞ• C++界隈ではちったー名の知れたソフト屋• Microsot MVP for Visual C++ 2004~• モノ書き? DDJJ, C-Magazine… CodeZine• 書籍いくつか プログラミング生放送勉強会 第17回@品川
  3. 3. Visual Studio (VC++) と C++11• Visual Studio 2010 は – C++11 の”いくつか”をサポート• Visual Studio 2012 では – 言語レベルでの強化 と – ライブラリ追加 によって – より C++11 に迫っています – “フルコンプ”じゃないけどね プログラミング生放送勉強会 第17回@品川
  4. 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. 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. 6. autovector<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. 7. range-based forvector<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. 8. foreach(.NET) にはできないことvector<int> v; vector<int> v;for ( int& item : v ) { for ( auto& item : v ) { ++item; ++item;} } 「参照」できちゃうですね♪プログラミング生放送勉強会 第17回@品川
  9. 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. 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. 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] != L0 ) { *reinterpret_cast<wostream*>(lParam) << buf << endl; } return TRUE; }, reinterpret_cast<LPARAM>(&wcout)); __cdecl, __stdcall のどちらにも使えます。 プログラミング生放送勉強会 第17回@品川
  12. 12. Win-API によるスレッド// スレッド本体int plus(int x, int y) { return x + y; }// Win32 thread のためのwrappertypedef 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. 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. 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. 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. 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回@品川

×