[2018年5月30号]C++ primer 课后练习 第十六章 模版与泛型编程

16.17

当class和typename同在模版参数列表中时,两者并无不同(P580),但是当函数返回类型是模版内定义的类型成员时,必须使用typename,.用来区分是否是static成员

16.18

a.

template <typename T, typename U,typename V>
void f1(T,U,V); 

b.

template <typename T>
T f2(T& i){

}

C.

template <typename T> inline T foo(T,unsigned int*);

d.缺少返回类型符

template <typename T> void f4(T,T){
}

e.typedef char Ctype 会被忽略

typedef char Chartype;
template <typename Ctype> Ctype f5(Ctype a){
    return a;
}

16.19

template <typename T>
void printContainer(T & con){
    for(typename T::size_type i = 0 ; i != con.size(); i++){
        cout << con[i] << ends;
    }
    cout <<endl;
}

int main() {
    vector<int> vecI = { 1,2,3,4,5,6,7,8,9 };
    vector<char> vecC = { 'a','b','c','d' };
    printContainer(vecI);
    printContainer(vecC);
    for (;;);
    return 0;
}
16.20
template <typename T>
void printContainerIterator(T & con) {
    for (typename T::iterator it = con.begin(); it != con.end(); it++) {
        cout << *it << ends;
    }
    cout << endl;
}

int main() {
    vector<int> vecI = { 1,2,3,4,5,6,7,8,9 };
    vector<char> vecC = { 'a','b','c','d' };
    printContainerIterator(vecI);
    printContainerIterator(vecC);
    for (;;);
    return 0;
}

16.21

class DebugDelete {
public:
    DebugDelete(ostream& os = std::cerr) :os(os) {}
    template<typename T>
    void operator()(T * p) {
        os << "delete p " << endl;
        delete p;
    }
private:
    ostream & os;
};

16.22

class QueryResult;
using line_no = vector<string >::size_type;
class TextQuery {
public:
    TextQuery(ifstream&);
    TextQuery(const TextQuery& tq) :file(new StrVec(*tq.file), DebugDelete()) {
        for (auto it : tq.wm) {
            wm[it.first].reset(new set<line_no>(it.second->begin(), it.second->end()), DebugDelete());
        }
    };
    TextQuery(ifstream& ifs, const set<int > setInt) :file(new StrVec()) {
        string lineStr, word;
        while (getline(ifs, lineStr))
        {
            file->push_back(lineStr);
            int lineCount = file->size();
            if(setInt.find(lineCount) == setInt.end()){
                continue;
            }
            istringstream ist(lineStr);
            while (ist >> word)
            {
                shared_ptr<set<line_no>>& line = wm[word];
                
                if (!line) {
                    line.reset(new set<line_no>, DebugDelete());
                }
                line->insert(lineCount);
            }
        }
    };
    //int getSize()const { return file->size(); };
    //void clear()const {  file->clear(); };
    QueryResult query(const string &)const;
private:
    shared_ptr<StrVec> file;
    map<string, shared_ptr<set<line_no>>> wm;
};

TextQuery::TextQuery(ifstream & ifs) :file(new StrVec(), DebugDelete()) {
    string lineStr, word;
    while (getline(ifs, lineStr))
    {
        file->push_back(lineStr);
        int lineCount = file->size();
        istringstream ist(lineStr);
        while (ist >> word)
        {
            shared_ptr<set<line_no>>& line = wm[word];
            if (!line) {
                line.reset(new set<line_no>, DebugDelete());
            }
            line->insert(lineCount);
        }
    }
}
16.23

在智能指针释放的时候进行调用结果也是如此,作用域结束后释放指针时,调用了函数对象



16.24

template <typename T>
template <typename BT>
Blob<T>::Blob(BT  begin, BT end) :data(make_shared<vector<T>>(begin, end)) {

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值