危ないRiSKのブログ このページをアンテナに追加 RSSフィード Twitter

                  

2009-11-05 (Thu)

[]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>>("  "));
 }
}

[]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;
}

[]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);
 }
}

[]push_back, push_front, std::deque

両頭待ち行列 deque

ex06-05 を次のように少し書き換えるだけですぐ動作させることができる。

vector -> deque // コンテナ変更

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);
 }
}

[]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;
}

[][]そこで 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 ってしちゃうなぁ。

[][]1時間作ってみたの人

【プログラミング】オセロを1時間で作ってみた【実況解説】‐ニコニコ動画(9)

【プログラミング】テトリスを1時間強で作ってみた【実況解説】‐ニコニコ動画(9)

この方のインタビュー記事が掲載されました。

「テトリスを1時間強で作ってみた」動画の投稿者にインタビュー──「プログラミングの楽しさ伝えたい」:ITpro

過去にはIBM東京基礎研究所JavaScript研究していたこともある。

それで DOM を暗記してたのか…。

2008年に設立したブロードテイル社のCEO

動画に「CEOの犯行」ってタグつけられてて吹いたw

以前は,「7行プログラミング」という2ちゃんねるスレによく書き込んでいたのですよ。「トリッキーの1」っていうハンドルネームで「6行オセロ」とかを作っていて,面白かったですね。

おまいかぁー!…ずいぶんと身近にいたんだなw