C++ã®STLã¢ã«ã´ãªãºã ã«ã¯é¢æ°ãã¤ã³ã¿ããã颿°ãªãã¸ã§ã¯ããæ¸¡ããã¨ãã話
C++ã®algorithmãããã¼ã§å®£è¨ããã¦ããSTLã®ã¢ã«ã´ãªãºã 颿°ãã³ãã¬ã¼ãã«ã¯ï¼å¼æ°ã«é¢æ°ãã¤ã³ã¿ã颿°ãªãã¸ã§ã¯ã(ãã¡ã³ã¯ã¿)ãåããã®ãå¤ãï¼
ä¾ãã°ï¼å¼æ°ãä¸ã¤ã®é¢æ°ãåãåãstd::transformã¯ä»¥ä¸ã®ã³ã¼ãã¨ç価ã§ããï¼
template <class InputIterator, class OutputIterator, class UnaryOperator> OutputIterator transform (InputIterator first1, InputIterator last1, OutputIterator result, UnaryOperator op) { while (first1 != last1) *result++ = op(*first1++); return result; }
transformã®å¼æ°opã«ã¯é¢æ°ãã¤ã³ã¿ï¼ãããã¯operator()ãå®ç¾©ãããclassãstruct(ã¤ã¾ã颿°ãªãã¸ã§ã¯ã)ã®ã¤ã³ã¹ã¿ã³ã¹ã渡ããã¨ãã§ããï¼
vector<int> v; // 颿°ãã¤ã³ã¿ã®å ´å int inc(int n) { return n + 1; } transform(v.begin(), v.end(), v.begin(), inc); // 颿°ãªãã¸ã§ã¯ãã®å ´å struct Inc : public unary_function<int, int> { int operator ()(int n) { return n + 1; } }; transform(v.begin(), v.end(), v.begin(), Inc());
颿°ãã¤ã³ã¿ããã颿°ãªãã¸ã§ã¯ãã使ã£ãæ¹ãããã¨ãã話
è¨äºã®ã¿ã¤ãã«ã«ãããéãï¼STLã¢ã«ã´ãªãºã ã«ã¯é¢æ°ãã¤ã³ã¿ããã颿°ãªãã¸ã§ã¯ããæ¸¡ãããã«ããæ¹ãããï¼ãã®çç±ã¯é¢æ°å¼ã³åºãã®ã¤ã³ã©ã¤ã³åã¨é¢ä¿ãããï¼
颿°ãã¤ã³ã¿ã®å ´åã¯é¢æ°ã®å¼ã³åºããã¤ã³ã©ã¤ã³åã§ããªã
STLã¢ã«ã´ãªãºã ã«é¢æ°ãã¤ã³ã¿ã渡ããå ´åï¼ãã®é¢æ°ã®å¼ã³åºãã«ã¯é¢æ°ã®ã¢ãã¬ã¹å¤ãå¿
è¦ã§ããï¼é¢æ°ã®ã¢ãã¬ã¹å¤ã¯ããã°ã©ã å®è¡æã«æ±ºã¾ã<è¿½è¨ 2011/02/21 11:13>颿°ã®ã¢ãã¬ã¹å¤ã¯ã³ã³ãã¤ã«æã«æ±ºã¾ãããã§ã追è¨>ï¼ãã®ããï¼ãã¨ãå¼ã³åºãå
ã®é¢æ°ãinlineæå®ããã¦ããã¨ãã¦ãï¼ãã®é¢æ°ããã¤ã³ã¿çµç±ã§å¼ã³åºããå ´åã¯(ã»ã¨ãã©ã®ã³ã³ãã¤ã©ã§ã¯)ã¤ã³ã©ã¤ã³åãããªãï¼
颿°ãªãã¸ã§ã¯ãã®å ´åã¯operator()ã®å¼ã³åºããã¤ã³ã©ã¤ã³åã§ãã
STLã¢ã«ã´ãªãºã ã«é¢æ°ãªãã¸ã§ã¯ããæ¸¡ããå ´åï¼ã³ã³ãã¤ã©ã¯ãã®operator()ã®å¼ã³åºããéçã«è§£æ±ºãããã¨ãã§ããï¼ãã®ããï¼operator()ãinlineæå®ããã¦ããå ´åï¼ã³ã³ãã¤ã©ã¯ãã®å¼ã³åºããã¤ã³ã©ã¤ã³åãã¦é«éåãããã¨ãå¯è½ã§ããï¼
ã¾ãï¼é¢æ°ãªãã¸ã§ã¯ããSTLã¢ã«ã´ãªãºã ã«æ¸¡ãå ´åã¯é¢æ°ãªãã¸ã§ã¯ãã®ã¤ã³ã¹ã¿ã³ã¹ãçæããå¿
è¦ããããï¼ãã®éã®ãªã¼ãã¼ãããã¯å¤§æµã³ã³ãã¤ã«æã®æé©åã§å¸åãããããåé¡ã«ã¯ãªããªãï¼
é度æ¯è¼
STLã¢ã«ã´ãªãºã ã«é¢æ°ãã¤ã³ã¿ã渡ããå ´åã¨é¢æ°ãªãã¸ã§ã¯ããæ¸¡ããå ´åã§ã©ããããé度ã«å·®ãåºãããç°¡åãªå®é¨ã§èª¿ã¹ã¦ã¿ãï¼
颿°ãã¤ã³ã¿ã®å ´å
以ä¸ã®ããã«ï¼intåã®å¤ãã¤ã³ã¯ãªã¡ã³ããã颿°incãå®ç¾©ãï¼std::transformã«ãã®é¢æ°ãã¤ã³ã¿ã渡ãããã°ã©ã ãæ¸ãï¼å®è¡æéãæ¸¬ã£ãï¼
#include <algorithm> #include <vector> using namespace std; // inlineæå®ãã inline int inc(int n) { return n + 1; } int main(int argc, const char *argv[]) { vector<int> v(10000000, 1); for (int i = 0; i < 100; ++i) { transform(v.begin(), v.end(), v.begin(), inc); } return 0; }
$ g++ -O2 test_functor_speed.cc $ time ./a.out ./a.out 3.22s user 0.06s system 98% cpu 3.335 total
è¦ç´ æ°10Mã®vectorã«å¯¾ããtransformã100åç¹°ãè¿ãã¦3ç§ç¨ããã£ãï¼è¨æ¸¬ã¯10åã»ã©è¡ã£ããï¼å¾åã¯å¤ãããªãã£ãï¼
颿°ãªãã¸ã§ã¯ãã®å ´å
次ã«ï¼å ç¨ã®incã®é¢æ°ãªãã¸ã§ã¯ãçãæ¸ãï¼std::transformã«æ¸¡ãã¦åæ§ã«å®è¡æéãæ¸¬ã£ãï¼
#include <algorithm> #include <functional> #include <vector> using namespace std; struct Inc : public unary_function<int, int> { // ã¯ã©ã¹å®ç¾©ã®ä¸ã«ã¡ã³ã颿°ã®å®ç¾©ãç´æ¥è¨è¿°ãã¦ããããï¼ // æé»ã«ã¤ã³ã©ã¤ã³åããã int operator ()(int n) { return n + 1; } }; int main(int argc, const char *argv[]) { vector<int> v(10000000, 1); for (int i = 0; i < 100; ++i) { transform(v.begin(), v.end(), v.begin(), Inc()); } return 0; }
$ g++ -O2 test_functor_speed.cc $ time ./a.out ./a.out 2.07s user 0.06s system 99% cpu 2.142 total
2ç§ç¨åº¦ï¼é¢æ°ãã¤ã³ã¿ã®å ´åã¨æ¯ã¹ã¦ç´1.5åé«éã ã£ãï¼ãã¡ããè¨æ¸¬ã¯10åã»ã©è¡ã£ããå¾åã¯åãã ã£ãï¼
çµè«
STLã¢ã«ã´ãªãºã ã«ã¯é¢æ°ãã¤ã³ã¿ããã颿°ãªãã¸ã§ã¯ããæ¸¡ãããã«ãããï¼ä½æ ãªãã°ï¼å¾è ã¯é¢æ°å¼ã³åºãã®ã¤ã³ã©ã¤ã³åã«ãã£ã¦é«éåãããå ´åãããããã ï¼
ããããäºç´°ãªãã¨ã®ç©ã¿éããããã°ã©ã ã®å¤§å¹ ãªé度ä½ä¸(åä¸)ã«ç¹ããã¨æãã¨é常ã«ã¢ã¬ãªã®ã§æ°ãã¤ãããï¼
è¿½è¨ (2011/02/21 11:13)
ä¸è¿°ã®å®é¨ã§ã¯gcc 4.2.1ã§è¡ã£ãï¼åãå®é¨ããgcc 4.6ã§è¡ã£ã¦ã¿ãã¨ããï¼é¢æ°ãã¤ã³ã¿çã¨é¢æ°ãªãã¸ã§ã¯ãçã®é度ãã»ã¼çãããªã£ãï¼ã¾ãï¼gccã«-Sãªãã·ã§ã³ãä»ãã¦ã¢ã»ã³ããªã³ã¼ããçæãããã¨ããï¼gcc 4.6ã§ã¯ä¸¡è ã®ã¢ã»ã³ããªã³ã¼ããä¸è´ãã(gcc 4.2.1ã ã¨ä¸è´ããªãã£ã)ï¼
æè¿ã®ã³ã³ãã¤ã©ã ã¨é¢æ°ãã¤ã³ã¿çµç±ã®é¢æ°å¼ã³åºãã§ãã¡ããã¨ã¤ã³ã©ã¤ã³åãããã±ã¼ã¹ãå¢ããããã ï¼ããã§ãå ¨ã¦ã®ç°å¢ã®ã³ã³ãã¤ã©ã颿°ãã¤ã³ã¿ã®å ´åã®æé©åããã¦ãããããã§ã¯ãªãã®ã§ï¼å¯è½ãªãã°é¢æ°ãªãã¸ã§ã¯ããåªå çã«ä½¿ãã¹ãã ããï¼
åèè³æ
- Effective STL 第46é ã¢ã«ã´ãªãºã ã®ãã©ã¡ã¼ã¿ã¨ãã¦é¢æ°ã®ä»£ããã«é¢æ°ãªãã¸ã§ã¯ãã®ä½¿ç¨ãèããã

Effective STLâSTLã广çã«ä½¿ãããªã50ã®éå
- ä½è : ã¹ã³ããã¡ã¤ã¤ã¼ãº,Scott Meyers,ç´°è°·æ
- åºç社/ã¡ã¼ã«ã¼: ãã¢ã½ã³ã¨ãã¥ã±ã¼ã·ã§ã³
- çºå£²æ¥: 2002/01
- ã¡ãã£ã¢: åè¡æ¬
- è³¼å ¥: 9人 ã¯ãªãã¯: 155å
- ãã®ååãå«ãããã° (95ä»¶) ãè¦ã