一 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;
}
// 问题描述:输入一个带括号的表达式,输出所有的计算步骤
#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变量取下标对应的都是字符,不是字符串;