Effective STL 20 Specify comparison types for associative containers of pointers
2017-08-28 11:11
447 查看
define a set
I. specify comparison type
II. better way to specify comparison
III. why better?
print directly
for_each print
transform print
set<string*>ssp; // is shorthand for this: set<string*, less<string*> > ssp; // to be completely accurate, it's shorthand for set<string*, less<string*>, allocator<string*> > ssp;
I. specify comparison type
// set tmplate's three parameters is a type. it wants a type that can // internally instantiate to create a function. struct StringPtrLess: public binary_function<const string*, const string*, bool> { bool operator()(const string* *ps1, const string* ps2) const { return *ps1 < *ps2; } }; typedef set<string*, StringPtrLess> StringPtrSet; StringPtrSet ssp;
II. better way to specify comparison
struct DeferenceLess { template<typename PtrType> bool operator()(PtrType pT1, PtrType pT2) const { return *pT1 < *pT2; } }; set<string*, DerefernceLess> ssp;
III. why better?
// explanation (from item 7) class SpecialString:public string {...}; template<typename T> struct DeleteObject: public unary_function<const T*, void> { void operator()(const T* ptr) const { delete ptr; } }; deque<SpecialString*> dssp; ... for_each(dssp.begin(), // Error! Deletion of a derived dssp.end(), DeleteObject<string>()); // object via a base class pointer // where there is no virtual // destructor // then, move the templatization from DeleteObject to its operator(): struct DeleteObject { template<typename T> void operator()(const T*ptr) const { delete ptr; } deque<SpecialString*> dssp; ... // Compilers know the type of pointer being passed to DeletObject::operator(), // so we have them automatically instantiate an operator() taking that type of pinter for_each(dssp.begin(), dssp.end(), DeleteObject()); // well!
print directly
for (StringPtrSet::const_iterator i = ssp.begin(); i != ssp.end(); ++i) { cout << *i << endl;
for_each print
void print(const string *ps) { cout << *ps << endl; } for_each(ssp.begin(), ssp.end(), print);
transform print
// Compilers know the type of pointer being passed to DeletObject::operator(), // so we have them automatically instantiate an operator() taking that type of pinter // when functors of this type are passed a T*, they return a const T& struct Dereference { template<typename T> const T& operator()(const T *ptr) const { return *ptr; } }; transform(ssp.begin(), ssp.end(), ostream_iterator<stirng>(cout, "\n"), Dereference());
相关文章推荐
- #254 – 能够装载FlowDocument的容器(Types of Containers for Hosting a FlowDocument)
- 关于container_of和list_for_each_entry 及其相关函数的分析
- 关于container_of和list_for_each_entry 及其相关函数的分析
- [Cycle.js] Generalizing run() function for more types of sources
- Linux内核中list_head、list_for_each、list_entry、container_of之间的关系
- 关于container_of和list_for_each_entry 及其相关函数的分析
- The Container Comparison of C++ with C#
- 关于container_of和list_for_each_entry 及其相关函数的分析
- libc/sysdeps/linux/common/sendfile.c:20: error: conflicting types for 'sendfile64'
- No signature of method: java.lang.String.positive() is applicable for argument types: () values: []
- Item20 Use std::weak_ptr for std::shared_ptr like pointers that can dangle
- Tomcat vs. Jetty vs. Undertow: Comparison of Spring Boot Embedded Servlet Containers
- Device Class GUIDs for Popular Types of Hardware
- "SQL Server does not handle comparison of NText, Text, Xml, or Image data types."
- Comparison of container formats
- Welcome to my comparison of AJAX frameworks for ASP.NET
- Command(Chapter 20 of Pro Objective-C Design Patterns for iOS)
- STL Associative Containers Types:map、set、multimap、mutilset以及对应的unordered类型
- Top 20 Online Tools Useful For Any Type of Web Developer
- The Standard Librarian: I/O and Function Objects: Containers of Pointers