C++ primer第9章--容器的简单实用

一 string基本操作的使用,以前都不晓得string这么强大!

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string q1("When lilacs last in the dooryard bloom'd'");
    string::size_type pos = q1.find("in");
    string::size_type pos1 = q1.find("bloom");
    int len = pos1 - pos - 1;
    q1.replace(0, q1.size(), q1, pos, len);
    //cout << "pos is:" << *(q1.begin()+pos+1) << endl;

    string q2("The child is father of the man");
    pos = q2.find("father");
    q2.replace(q2.begin()+pos, q2.end(), q1);

    string sentence(q2);
    cout << "sentence is:" << sentence << endl;

    cout << "q1 is: " << q1 << endl;
    cout << q1.find_first_of("in") << endl;;
    cout << q1.find("last") << endl;
    cout << q1.rfind("door") << endl;
    cout << q1.find_last_of("door");
    return 0;
}
我的理解:
1 find 返回字符串中第一次出现substr的位置,返回的类型为size::type,可直接当做int使用;
2 replace(pos, len, args)、replace(b, e, args) 返回的都是s的引用;args 可以是 下标操作(s2, pos, len) 或迭代器操作(b1, e1), 但具体是哪一种必须和args前面的一致;
3 find 、find_first_of、rfind的区别:find返回substr第一次出现的位置,find_first_of返回substr中任意字符第一次出现的位置,rfind 返回substr最后一次出现的位置;
4 find如果没有找到,将返回string::npos的特殊值,比如我系统上面的4294967295。


二 题目:C++ primer上面297页习题9.39,判断sentence中有多少个单词,并指出其中最长和最短的单词,
如果有多个最长或最短的单词,把他们全部输出来

#include <iostream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

int main(){
    string line1("We were her pride of 10 she named us:");
    string line2("Benjamin, Phoenix, the Prodigal");
    string line3("and perspicacious pacific Suzanne");

    string sentence = line1 + ' ' + line2 + ' ' + line3;
    cout << "original string is: " << sentence << endl;

    stringstream sen(sentence);

    int num(0), len(0);
    string::size_type min(100), max(0);
    string tmp;
    string re;
    vector<string> vec_max, vec_min;
    while (sen >> tmp){
        len = tmp.size();
        while (!tmp.empty()){
            if ((tmp[len-1]>='a' && tmp[len-1]<='z')
                || (tmp[len-1]>='A' && tmp[len-1]<='Z')){
                    re += tmp + " ";
                    break;
                }
            else{
                tmp.erase(len-1, 1);
                len = tmp.size();
            }
        }
        if (tmp.size()){
            num++;
            if (tmp.size()==max)
                vec_max.push_back(tmp);
            if (tmp.size()>max){
                vec_max.clear();
                vec_max.push_back(tmp);
                max = tmp.size();
            }
            if (tmp.size()==min)
                vec_min.push_back(tmp);
            if (tmp.size()<min){
                vec_min.clear();
                vec_min.push_back(tmp);
                min = tmp.size();
            }

        }

    }
    cout << "string after changed is: " << re << endl;
    cout << "total words is: " << num << endl;

    cout << "the max length of words is: " << max << endl;
    cout << "all words of same length are: " << endl;
    vector<string>::iterator iter=vec_max.begin();
    while (iter!=vec_max.end())
        cout << *iter++ << " ";
    cout << endl;

    cout << "the min length of words is: " << min << endl;
    cout << "all words of same length are: " << endl;
    iter = vec_min.begin();
    while (iter!=vec_min.end())
        cout << *iter++ << " ";

    return 0;
}
我的感想:
1 ' ' 和 ""的差别,程序中sentence1和sentence2无论内容还是size都是一样的;
2 如何判断是否为字母的方法
3 erase的使用,erase(pos, len)返回的是引用!
4 因为是和size比较,所以max、min必须定义为string::size_type类型而不是int,否则报错;
我觉得应该是:同为正数是可换用,负数则不行
5 if (tmp.size()==max)必须在if (tmp.size()>max)的前面,否则第一个word会输出2遍;
if (tmp.size()>max)如果写成if else (tmp.size()>max)则第一个word又会被漏掉。
真的有很多小的细节需要注意。


三 练习stack的定义和初始化

#include <iostream>
#include <deque>
#include <stack>
#include <vector>

using namespace std;


int main()
{
    stack<int> stk0;
    cout << "stack size: " << stk0.size() << endl;


    deque<int> deq_int;
    for (int i=0; i<10; ++i)
        deq_int.push_back(i);


    // stack的基础类型默认为deque
    stack<int> sta_int(deq_int);
    while (!sta_int.empty()){
        cout << sta_int.top();
        sta_int.pop();
    }
    cout << endl;


    vector<int> vec_int;
    for (int i=0; i<20; ++i)
        vec_int.push_back(i);


    // 用vector类型覆盖其默认类型
    stack< int, vector<int> > stk(vec_int);
    while (!stk.empty()){
        cout << stk.top();
        stk.pop();
    }
    return 0;
}


四 练习stack的使用
// 问题描述:输入一个带括号的表达式,输出所有的计算步骤

#include <iostream>
#include <stack>

using namespace std;

int main()
{
    string Exp;
    cout << "please input a exp:" << endl;
    getline( cin, Exp );

    stack<char> sExp;
    stack<char> tmp;

    int num(0);
    string::iterator iter = Exp.begin();
    while ( iter != Exp.end() ){
        // process every charater
        if ( *iter != ')')
                sExp.push(*iter);
        else{
                cout << "step " << ++num << ": ";
                while ( sExp.top() != '(' ){
                        //cout << sExp.top();
                        tmp.push(sExp.top());
                        sExp.pop();
                       }
                while (!tmp.empty()){
                    cout << tmp.top();
                    tmp.pop();
                }
                cout << endl;
                sExp.pop();
                sExp.push('@');

        }
        iter++;
    }
    cout << "last step: ";
    while ( !sExp.empty() ){
        //cout << sExp.top() << " ";
        tmp.push( sExp.top() );
        sExp.pop();
    }
    while ( !tmp.empty() ){
            cout << tmp.top();
            tmp.pop();}
    return 0;
}
我的感想:

string变量取下标对应的都是字符,不是字符串;





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值