//: C06:NString.h // From "Thinking in C++, Volume 2", by Bruce Eckel & Chuck Allison. // (c) 1995-2004 MindView, Inc. All Rights Reserved. // See source code use permissions stated in the file 'License.txt', // distributed with the code package available at www.MindView.net. // A "numbered string" that keeps track of the // number of occurrences of the word it contains. #ifndef NSTRING_H #define NSTRING_H #include #include #include #include #include typedef std::pair psi; // Only compare on the first element bool operator==(const psi& l, const psi& r) { return l.first == r.first; } class NString { std::string s; int thisOccurrence; // Keep track of the number of occurrences: typedef std::vector vp; typedef vp::iterator vpit; static vp words; void addString(const std::string& x) { psi p(x, 0); vpit it = std::find(words.begin(), words.end(), p); if(it != words.end()) thisOccurrence = ++it->second; else { thisOccurrence = 0; words.push_back(p); } } public: NString() : thisOccurrence(0) {} NString(const std::string& x) : s(x) { addString(x); } NString(const char* x) : s(x) { addString(x); } // Implicit operator= and copy-constructor are OK here. friend std::ostream& operator<<( std::ostream& os, const NString& ns) { return os << ns.s << " [" << ns.thisOccurrence << "]"; } // Need this for sorting. Notice it only // compares strings, not occurrences: friend bool operator<(const NString& l, const NString& r) { return l.s < r.s; } friend bool operator==(const NString& l, const NString& r) { return l.s == r.s; } // For sorting with greater: friend bool operator>(const NString& l, const NString& r) { return l.s > r.s; } // To get at the string directly: operator const std::string&() const { return s; } }; // Because NString::vp is a template and we are using the // inclusion model, it must be defined in this header file: NString::vp NString::words; #endif // NSTRING_H ///:~