很多C++书籍都鼓励我们使用vector替换数组,使用string替换传统的字符串,我一直相信可以这么做,而且这么做了以后,会减少工作量,提高效率。知道是一回事,实际操作起来是一回事,每次使用string的时候总会有这样那样的问题。我在想,之所以Accelerated c++这本书这么有名,或许就是因为作者直接教我们用C++的方式思考,这本书只看了一小部分,但是有个例子很能说明问题——作者教我们如何以C++的方式思考。
下面的两个程序都是实现相同的功能,读入一行,如后将该句子里的单词拆分出来。
程序1:
#include<iostream> #include<vector> #include<cctype> #include<string> using namespace std; vector<string>split(const string&s) { vector<string> ret; typedef string::size_type string_size; string_size i = 0; while( i != s.size() ) { while( i != s.size() && isspace(s[i])) ++i; string_size j =i; while( j != s.size() && ! isspace( s[j])) ++j; if( i != j) { ret.push_back( s.substr(i,j - 1 )); i = j; } } return ret; } int main() { string str; getline( cin, str); vector<string> vec = split( str ); cout << " vec.size() = " << vec.size() << endl; cout << str << endl; return 0; }程序2(纯C++实现):
#include<iostream> #include<vector> #include<cctype> #include<string> #include<algorithm> using namespace std; bool space( char c) { return isspace(c); } bool not_space( char c) { return !isspace(c); } vector<string> split( const string& str) { typedef string::const_iterator iter; vector<string> ret; iter i = str.begin(); while( i != str.end()) { i = find_if( i , str.end(), not_space); iter j = find_if( i, str.end(), space); if ( i != str.end() ) ret.push_back( string( i,j )); i = j; } return ret; } int main() { string str; getline( cin, str); vector<string> vec = split( str ); cout << "vec.size() = " << vec.size() << endl; cout << str << endl; return 0; }书上还有一个例子很好,可以用来考察一个是否很熟悉STL,用一行代码来判断一个字符串是不是回文:
#include<iostream> #include<algorithm> #include<string> using namespace std; int main() { string str; cin >> str; //核心代码就这么一行 if( equal( str.begin(), str.end(), str.rbegin()) ) { cout << str << " is a plaindrome " << endl; } else { cout << str << " is not a plaindrome " << endl; } return 0; }