今天是中秋节+国庆节,祝大家节日快乐!!
目录
第四章4.1&&4.2:造轮子stack
Stack.h
Stack.cpp
第六章6.1:将class改写成template
保证宏定义函数单句展开的do{…}while(0)技巧
第四章4.1&&4.2:造轮子stack
这里只是用class来造,所以只能支持一种类型,这里是指定string
后面会用template改写来支持所有类型!
Stack.h
#include <string>
#include <vector>
#include <algorithm>
using namespace std;class Stack{
public:bool push(const string& );bool pop(string &elem);bool peek(string &elem);bool find(const string &elem) const;int count(const string &elem) const;// class的成员函数会被自动视为内联函数!bool empty() const {return _stack.empty();}bool full() const {return _stack.size()==_stack.max_size();}int size() const {return _stack.size();}private:vector<string> _stack;};bool Stack::pop(string &elem){if(empty()){return false;}elem = _stack.back();return true;
}bool Stack::peek(string &elem) {if(empty()){return false;}elem = _stack.back();return true;
}bool Stack::push(const string &elem) {if(full()){return false;}_stack.push_back(elem);return true;
}bool Stack::find(const string &elem) const {vector<string>::const_iterator end_it = _stack.end();return ::find(_stack.begin(), end_it, elem)!=end_it;
}int Stack::count(const string &elem) const {return ::count(_stack.begin(),_stack.end(), elem);
}
Stack.cpp
#include "Stack.h"
#include <iostream>
using namespace std;int main(){Stack st;string str;while(cin>>str && ! st.full()){st.push(str);}if(st.empty()){cout<< "No strings were read!"<<endl;return 0;}st.peek(str);if(st.size()==1&&str.empty()){cout<<"No strings were read!"<<endl;return 0;}while(st.size()){if(st.pop(str)){cout<<str<<' ';}}return 0;
}
第六章6.1:将class改写成template
#include <iostream>
using namespace std;
/*
class example{
public:example ( double min, double max );example ( const double *array, int size );double& operator[] (int index);bool operator == ( const example& ) const;bool insert ( const double*, int );bool insert ( double );double min() const {return _min;}double max() const {return _max;}void min(double);void max(double);int count(double value) const;private:int size;double *parray;double _min;double _max;
};
*/
// 以传址的方式减少对象复制带来不必要的开销,保证效率最佳
template <typename elemType> class example{
public:example (const elemType &min, const elemType &max);example (const elemType *array, int size);elemType& operator==(int index);bool operator==(const example1& ) const;bool insert(const elemType*, int);bool insert(const elemType);elemType min() const{return _min;} elemType max() const{return _max;}void min(const elemType& );void max(const elemType& );int const(const elemType &value) const;private:int size;double *parray;double _min;double _max;};int main(){return 0;
}
保证宏定义函数单句展开的do{…}while(0)技巧
在纯C语言的环境下宏定义函数会被经常使用,但是在C++当中,常用其他的方式(例如const static)代替,详细可以参见effective C++
但是在宏定义函数当中会出现一个问题,试着思考:
#define help(x) {\// 执行语句1; \// 执行语句2; \
}
这里将help(x)函数拆分成两条语句进行宏定义,看似没有问题,但是如果出现以下的情况时候:
if(condition) help(x);
else……
help(x)会被自动展开为两条语句,此处if后面有没有接着大括号{}(可见统一标准编程风格习惯还是很重要的),就会出错!
所以将上面的宏定义函数定义成:
#define help(x) do{\// 执行语句1; \// 执行语句2; \
} while(0)
就可以完美解决刚才出现的问题,算是一个常用的小技巧吧!