2009-11-05 (Thu)
■[C++]splice, std::list
STL―標準テンプレートライブラリによるC++プログラミング 第2版
// P152 ex06-12.cpp #include<string> template<typename Container> typename Container make(const char* s){ const std::string str(s); return Container(str.begin(), str.end()); } #include<iostream> #include<list> #include<algorithm> #include<cassert> int main(){ using std::cout; using std::endl; using std::list; using std::find; using std::search; cout << "Demonstrating STL splice functions." << endl; { // list1.splice(iterator1, list2) list2 全部を list1 へ list<char> l1(make<list<char>>("There is something about science.")), l2(make<list<char>>("fascinating ")); l1.splice(find(l1.begin(), l1.end(), 'a'), l2); assert(l1 == make<list<char>>("There is something fascinating about science.")); assert(l2.empty()); } { // list1.splice(iterator1, list2, iterator2) iterator2 の先の要素を list1 へ list<char> l1(make<list<char>>("One gets such wholesale return of conjecture")), l2(make<list<char>>("out of ssuch a trifling investment of fact.")), l3(make<list<char>>(" of")); list<char>::const_iterator i = search(l1.begin(), l1.end(), l3.begin(), l3.end()), j = find(l2.begin(), l2.end(), 's'); // l1 の " of" の直前に,l2 の 's' をつなぎかえる l1.splice(i, l2, j); assert(l1 == make<list<char>>("One gets such wholesale returns of conjecture")); assert(l2 == make<list<char>>("out of such a trifling investment of fact.")); } { // list1.splice(iterator1, list2, iterator2begin, iterator2end) list2 の範囲を list1 へ list<char> l1(make<list<char>>("Mark Twain")), l2(make<list<char>>(" --- ")); list<char>::iterator j = find(l2.begin(), l2.end(), ' '), k = find(++j, l2.end(), ' '); l1.splice(l1.begin(), l2, j, k); assert(l1 == make<list<char>>("---Mark Twain")); assert(l2 == make<list<char>>(" ")); } }
■[C++]erase, std::list
STL―標準テンプレートライブラリによるC++プログラミング 第2版
erase の時に無効になるイテレータは erase された要素を指すイテレータのみ。前や後ろのイテレータは有効なまま。
// P148 ex06-11.cpp #include<string> template<typename Container> Container make(const char* s){ const std::string str(s); return Container(str.begin(), str.end()); } #include<iostream> #include<list> #include<algorithm> #include<cassert> int main(){ using std::cout; using std::endl; using std::list; using std::find; cout << "Demonstrating STL list erase function." << endl; list<char> l(make<list<char> >("remembering")); list<char>::const_iterator i = find(l.begin(), l.end(), 'i'); l.erase(i++); // 後ろもイテレータは有効のまま assert(l == make<list<char>>("rememberng")); l.erase(i++); assert(l == make<list<char>>("rememberg")); l.erase(i++); assert(l == make<list<char>>("remember")); l.erase(l.begin()); assert(l == make<list<char>>("emember")); l.erase(l.begin()); assert(l == make<list<char>>("member")); cout << " --- Ok." << endl; }
■[C++]push_back, push_front, std::list
リスト list
ex06-09 を次のように少し書き換えるだけですぐ動作させることができる。
deque-> list // コンテナ変更
reverse(v2.begin(), v2.end()); -> v2.reverse(); // 効率のため
STL―標準テンプレートライブラリによるC++プログラミング 第2版
// P148 ex06-10.cpp #include<iostream> #include<string> #include<list> #include<cassert> #include<algorithm> int main(){ using std::cout; using std::endl; using std::string; using std::list; using std::reverse; { cout << "Demonstrating list push_back function" << endl; const string s1("Bjarne Stroustrup"); const list<char> v1(s1.begin(), s1.end()); list<char> v2; list<char>::const_iterator i = v1.begin(); const list<char>::const_iterator end = v1.end(); for(; i != end; ++i) v2.push_back(*i); assert(v1 == v2); } { cout << "Demonstrating list insertion at beginning" << endl; const string s1("Bjarne Stroustrup"), s2("purtsuortS enrajB"); const list<char> v1(s1.begin(), s1.end()); list<char> v2; list<char>::const_iterator i = v1.begin(); const list<char>::const_iterator end = v1.end(); for(; i != end; ++i) v2.push_front(*i); assert(v2 == list<char>(s2.begin(), s2.end())); v2.reverse(); assert(v1 == v2); } }
■[C++]push_back, push_front, std::deque
両頭待ち行列 deque
ex06-05 を次のように少し書き換えるだけですぐ動作させることができる。
v2.insert(v2.begin(), *i); -> v2.push_back(*i); // 効率のため
STL―標準テンプレートライブラリによるC++プログラミング 第2版
// P144 ex06-09.cpp #include<iostream> #include<string> #include<deque> #include<cassert> #include<algorithm> int main(){ using std::cout; using std::endl; using std::string; using std::deque; using std::reverse; { cout << "Demonstrating deque push_back function" << endl; const string s1("Bjarne Stroustrup"); const deque<char> v1(s1.begin(), s1.end()); deque<char> v2; deque<char>::const_iterator i = v1.begin(); const deque<char>::const_iterator end = v1.end(); for(; i != end; ++i) v2.push_back(*i); assert(v1 == v2); } { cout << "Demonstrating deque insertion at beginning" << endl; const string s1("Bjarne Stroustrup"), s2("purtsuortS enrajB"); const deque<char> v1(s1.begin(), s1.end()); deque<char> v2; deque<char>::const_iterator i = v1.begin(); const deque<char>::const_iterator end = v1.end(); for(; i != end; ++i) v2.push_front(*i); assert(v2 == deque<char>(s2.begin(), s2.end())); reverse(v2.begin(), v2.end()); assert(v1 == v2); } }
■[C++]erase, std::vector
STL―標準テンプレートライブラリによるC++プログラミング 第2版
// P138 ex06-08.cpp #include<iostream> #include<string> #include<vector> #include<algorithm> #include<cassert> template<typename Container> Container make(const char* s){ const std::string str(s); return Container(str.begin(), str.end()); } int main(){ using std::cout; using std::endl; using std::string; using std::vector; using std::find; cout << "Demonstrating STL vector erase function." << endl; vector<char> v = make<vector<char>>("remembering"); vector<char>::const_iterator iter = find(v.begin(), v.end(), 'm'); assert(*iter == 'm' && *(iter+1) == 'e'); v.erase(iter--); assert(*iter == 'e' && *(iter+1) == 'e'); assert(v == make<vector<char>>("reembering")); v.erase(iter--); assert(*iter == 'r'); assert(v == make<vector<char>>("rembering")); v.erase(iter, iter + 3); assert(v == make<vector<char>>("bering")); v.erase(v.begin() + 1); assert(v == make<vector<char>>("bring")); cout << " --- Ok." << endl; }
■[プログラム言語C][C++]そこで NULL と比較しない選択肢を
→本当に細かい話 - NULLチェックと if文 - いろきゅう.jp 〜Programmable maiden〜 Tech side
* 変数a が NULL だったら、デフォルト値の*1b値を返して、NULL以外だったら a を返す
よーは、a がOK であれば a を、a がダメだったら b を返したい
というコードを書きたいという場合、超悩むのが「分岐条件をどうするべ」って所なんです。 …いや、NULLで比較するのは当たり前なんですけれども、
* a == NULL するか a != NULL するか。
で結構悩むんっすよねー。
私なら a ? a : b ってしちゃうなぁ。
■[Movie][Hoge]1時間で作ってみたの人
→【プログラミング】オセロを1時間で作ってみた【実況解説】‐ニコニコ動画(9)
→【プログラミング】テトリスを1時間強で作ってみた【実況解説】‐ニコニコ動画(9)
この方のインタビュー記事が掲載されました。
→「テトリスを1時間強で作ってみた」動画の投稿者にインタビュー──「プログラミングの楽しさ伝えたい」:ITpro
それで DOM を暗記してたのか…。
以前は,「7行プログラミング」という2ちゃんねるのスレによく書き込んでいたのですよ。「トリッキーの1」っていうハンドル・ネームで「6行オセロ」とかを作っていて,面白かったですね。
おまいかぁー!…ずいぶんと身近にいたんだなw
