ぱっと見でわかるC++11
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 1,697 views

 

Statistics

Views

Total Views
1,697
Views on SlideShare
1,694
Embed Views
3

Actions

Likes
2
Downloads
4
Comments
0

3 Embeds 3

https://twimg0-a.akamaihd.net 1
https://twitter.com 1
https://si0.twimg.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • パッと見でわかる C++11 わんくま同盟茶藝部顧問 episthmh episteme@cppll.jpプログラミング生放送勉強会 第17回@品川
  • episthmhて何者ぞ• C++界隈ではちったー名の知れたソフト屋• Microsot MVP for Visual C++ 2004~• モノ書き? DDJJ, C-Magazine… CodeZine• 書籍いくつか プログラミング生放送勉強会 第17回@品川
  • Visual Studio (VC++) と C++11• Visual Studio 2010 は – C++11 の”いくつか”をサポート• Visual Studio 2012 では – 言語レベルでの強化 と – ライブラリ追加 によって – より C++11 に迫っています – “フルコンプ”じゃないけどね プログラミング生放送勉強会 第17回@品川
  • 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回@品川
  • 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回@品川
  • 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回@品川
  • 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回@品川
  • foreach(.NET) にはできないことvector<int> v; vector<int> v;for ( int& item : v ) { for ( auto& item : v ) { ++item; ++item;} } 「参照」できちゃうですね♪プログラミング生放送勉強会 第17回@品川
  • 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回@品川
  • 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回@品川
  • 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回@品川
  • 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回@品川
  • <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回@品川
  • <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回@品川
  • <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回@品川
  • <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回@品川