练习9.41
编写程序,从一个vector<char>初始化一个string。
1 #include<iostream> 2 #include<vector> 3 #include<string> 4 int main() 5 { 6 std::cout<<"hello,sir"<<std::endl; 7 std::vector<char> a(10,'a'); 8 std::string b(&a[0],2); 9 std::cout<<b<<std::endl; 10 }
练习9.42
假定你希望每次读取一个字符存入一个string中,而且知道最少需要读取100个字符,应该怎样提高程序性能
c.reserve(100);
练习9.43
编写一个函数,接受三个string参数s,oldVal和newVal,使用迭代器及insert和erase函数将s中所有oldVal替换成newVal
1 void replace(string &s,string &oldVal,string &newVal) 2 { 3 for(string::size_type d=0;*d!=s.size();++d) 4 { 5 if(s.substr(d,oldVal.isze()==oldVal) 6 { 7 s.erase(d,oilVal.size()); 8 s.insert(d,newVal);}}}
练习9.44
重写上题,改用下标和replace
void replace(string &s,string &oldVal,string &newVal) 2 { 3 for(string::size_type d=0;*d!=s.size();++d) 4 { 5 if(s.substr(d,oldVal.isze()==oldVal) 6 { 7 s.replace(d,oldVal.size(),newVal);}}}
练习9.45
编写一个函数,接受一个表示名字的string参数和两个分别表示前缀和后缀的字符串添加到给定的名字中,将新生成的string返回
string func(string& s, const string& prefix,const string& endfix) { s.insert(0,prefix); s.append(endfix); return s; }
练习9.46
重写上题函数,使用位置和长度管理string,只使用insert
1 string func(string& s, const string& prefix,const string& endfix) 2 { 3 s.insert(0,prefix); 4 s.insert(s.size(),endfix); 5 return s; 6 } 7
练习9.47
编写程序,首先查找string“ab2c3dtr4e6”中的每个数字字符,然后查找其中每个字母字符,编写两个版本的程序,第一个使用find_first_of,第二个要使用find_first_not_of.
1 int main() 2 { 3 string alphabet{"ab2c3dtr4e6"}; 4 string numbers{"0123456789"}; 5 while((pos=alphabet.find_first_of(numbers,pos))!=string::npos){ 6 cout<<pos<<"is"<<alphabet[pos]<<endl; 7 ++pos;} 8 return 0; 9 }
1 int main() 2 { 3 string alphabet{"ab2c3dtr4e6"}; 4 string numbers{"0123456789"}; 5 while((pos=alphabet.find_first_not_of(numbers,pos))!=string::npos){ 6 cout<<pos<<"is"<<alphabet[pos]<<endl; 7 ++pos;} 8 return 0; 9 }
练习9.48
假定name和numbers的定义如325页所示,number.find(name)返回什么?
返回string::npos;
练习9.49
如果一个字母延伸到中线之上,如d或f,则称其有上出头部分,如果一个字母延伸到中线之下,就是下出头,编写程序,读入一个单词文件,输出最长的既不包含上出头部分,也不包含下出头的单词
1 #include<iostream> 2 #include<string> 3 #include<fstream> 4 5 using std::string;using std::ifstream;using std::endl;using std::cout; 6 7 int main() 8 { 9 ifstream ifs("word.txt"); 10 if(!ifs) 11 return -1; 12 13 string longest_word; 14 for(string word; ifs>>word; ) 15 if(word.find_first_not_of("aceimnorsuvwxz") == string::npos && 16 word.size()>longest_word.size()) 17 longest_word = word; 18 cout<<longest_word<<endl; 19 20 ifs.close(); 21 22 return 0; 23 }
练习9.50
编写程序处理一个vector<string>,其元素表示整型值。计算vector中所有元素之和。修改程序,使之计算表示浮点值的string的和。
1 int main() 2 { 3 std::vector<string> numbers{"123lkj123lkj123","123hjg","123bgh"}; 4 5 6 int sum=0; 7 for(auto d:numbers) 8 9 sum+=stoi(d); 10 cout<<sum<<endl; 11 12 }
1 int main() 2 { 3 std::vector<string> numbers{"123lkj123lkj123","123hjg","123bgh"}; 4 5 6 double sum=0; 7 for(auto d:numbers) 8 9 sum+=stod(d); 10 cout<<sum<<endl; 11 12 }
练习9.51
设计一个类,它有三个unsigned成员,分别表示年、月、日。为其编写构造函数,接受一个表示日期的string参数。你的构造函数应该能处理不同数据格式。
1 class date{ 2 public: 3 date(const string &a); 4 5 unsigned year=0,month=0,day=0; 6 }; 7 8 date::date(const string &a) 9 {string::size_type pos=0; 10 string notion{"/ ,"}; 11 if(a[0]>'A'&&a[0]<'z'){ 12 13 if(a.substr(0,2)=="Jan") 14 month=1; 15 else if(a.substr(0,2)=="Feb") 16 month=2; 17 else if(a.substr(0,2)=="Mar") 18 month=3; 19 else if(a.substr(0,2)=="Apr") 20 month=4; 21 else if(a.substr(0,2)=="May") 22 month=5; 23 else if(a.substr(0,2)=="Jun") 24 month=6; 25 else if(a.substr(0,2)=="Jul") 26 month=7; 27 else if(a.substr(0,2)=="Aug") 28 month=8; 29 else if(a.substr(0,2)=="Sep") 30 month=9; 31 else if(a.substr(0,2)=="Oct") 32 month=10; 33 else if(a.substr(0,2)=="Nov") 34 month=11; 35 else if(a.substr(0,2)=="Dec") 36 month=12; 37 pos=a.find_first_of(notion,pos); 38 ++pos; 39 } 40 41 else 42 { 43 month=stoi(a); 44 ++pos; 45 } 46 day=stoi(a); 47 ++pos; 48 year=stoi(a); 49 50 }
练习9.52
使用stack处理括号化的表达式。当你看到一个左括号,将其记录下来,当你在一个左括号之后看到一个右括号,从stack中pop对象,直至遇到左括号,将左括号一起弹出栈。然后将一个值push到栈中
1 #include <iostream> 2 #include <vector> 3 #include <stack> 4 #include <string> 5 #include <cstdlib> 6 #include <cctype> 7 #include <cstring> 8 using namespace std; 9 10 vector<string> prepare(char *str) 11 { 12 vector<string> tokens; 13 int len=strlen(str); 14 char *p=(char*)malloc(sizeof(char)*len+1); 15 int i=0,j=0; 16 while(i<len) 17 { 18 if(str[i]==' ') 19 { 20 ++i; 21 continue; 22 } 23 p[j]=str[i]; 24 ++j; 25 ++i; 26 } 27 p[j]='\0'; 28 j=0; 29 len=strlen(p); 30 while(j<len) 31 { 32 string token; 33 char temp[2]; 34 if(p[j]=='('||p[j]==')'||p[j]=='+'||p[j]=='*'||p[j]=='/') 35 { 36 temp[0]=p[j]; 37 temp[1]='\0'; 38 token=temp; 39 tokens.push_back(token); 40 41 42 } 43 else if(p[j]=='-') 44 { 45 if(p[j-1]==')'||isdigit(p[j-1])) 46 { 47 temp[0]=p[j]; 48 temp[1]='\0'; 49 token=temp; 50 tokens.push_back(token); 51 } 52 else 53 { 54 temp[0]='#'; 55 temp[1]='\0'; 56 token=temp; 57 tokens.push_back(token); 58 59 } 60 61 62 } 63 else 64 { 65 i=j; 66 while(isdigit(p[i])&&i<len) 67 ++i; 68 char *opd=(char*)malloc(i-j+1); 69 strncpy(opd,p+j,i-j); 70 opd[i-j]='\0'; 71 token=opd; 72 tokens.push_back(token); 73 j=i-1; 74 free(opd); 75 76 } 77 ++j; 78 }free(p); 79 return tokens; 80 } 81 82 int getPriority(string opt) 83 { 84 int priority; 85 if(opt=="#") 86 priority = 3; 87 else if(opt=="*"||opt=="/") 88 priority = 2; 89 else if(opt=="+"||opt=="-") 90 priority = 1; 91 else if(opt=="(") 92 priority = 0; 93 return priority; 94 } 95 96 void calculate(stack<int> &opdStack,string opt) 97 { 98 if(opt=="#") //进行负号运算 99 { 100 int opd = opdStack.top(); 101 int result = 0-opd; 102 opdStack.pop(); 103 opdStack.push(result); 104 cout<<"操作符:"<<opt<<" "<<"操作数:"<<opd<<endl; 105 } 106 else if(opt=="+") 107 { 108 int rOpd = opdStack.top(); 109 opdStack.pop(); 110 int lOpd = opdStack.top(); 111 opdStack.pop(); 112 int result = lOpd + rOpd; 113 opdStack.push(result); 114 115 cout<<"操作符:"<<opt<<" "<<"操作数:"<<lOpd<<" "<<rOpd<<endl; 116 } 117 else if(opt=="-") 118 { 119 int rOpd = opdStack.top(); 120 opdStack.pop(); 121 int lOpd = opdStack.top(); 122 opdStack.pop(); 123 int result = lOpd - rOpd; 124 opdStack.push(result); 125 cout<<"操作符:"<<opt<<" "<<"操作数:"<<lOpd<<" "<<rOpd<<endl; 126 } 127 else if(opt=="*") 128 { 129 int rOpd = opdStack.top(); 130 opdStack.pop(); 131 int lOpd = opdStack.top(); 132 opdStack.pop(); 133 int result = lOpd * rOpd; 134 opdStack.push(result); 135 cout<<"操作符:"<<opt<<" "<<"操作数:"<<lOpd<<" "<<rOpd<<endl; 136 } 137 else if(opt=="/") 138 { 139 int rOpd = opdStack.top(); 140 opdStack.pop(); 141 int lOpd = opdStack.top(); 142 opdStack.pop(); 143 int result = lOpd / rOpd; 144 opdStack.push(result); 145 cout<<"操作符:"<<opt<<" "<<"操作数:"<<lOpd<<" "<<rOpd<<endl; 146 } 147 } 148 149 int evamidexpr(char *str) 150 { 151 vector<string> tokens=prepare(str); 152 int i=0; 153 int len=tokens.size(); 154 stack<int> opdStack; 155 stack<string> optStack; 156 while(i!=len) 157 { 158 string token=tokens[i]; 159 if(token=="#"||token=="+"||token=="-"||token=="*"||token=="/") 160 { 161 if(optStack.empty()) 162 optStack.push(token); 163 else 164 { 165 if(getPriority(token)>getPriority(optStack.top())) 166 optStack.push(token); 167 else 168 { 169 int tokenPriority = getPriority(token); 170 string topOpt = optStack.top(); 171 int topOptPriority = getPriority(topOpt); 172 if(tokenPriority>topOptPriority) 173 { 174 optStack.push(token); 175 } 176 else 177 { 178 while(tokenPriority<=topOptPriority) 179 { 180 optStack.pop(); 181 calculate(opdStack,topOpt); 182 if(optStack.size()>0) 183 { 184 topOpt = optStack.top(); 185 topOptPriority = getPriority(topOpt); 186 } 187 else 188 break; 189 190 } 191 optStack.push(token); 192 } 193 } 194 }} 195 else if(token=="(") 196 { 197 optStack.push(token); 198 } 199 else if(token==")") 200 { 201 while(optStack.top()!="(") 202 { 203 calculate(opdStack,optStack.top()); 204 optStack.pop(); 205 } 206 optStack.pop(); 207 } 208 else 209 { 210 opdStack.push(atoi(token.c_str())); 211 } 212 ++i; 213 } while(optStack.size()!=0) 214 { 215 216 calculate(opdStack,optStack.top()); 217 optStack.pop(); 218 } 219 return opdStack.top(); 220 } 221 222 223 224 225 226 227 228 229 int main(int argc, char *argv[]) 230 { char *a = "((3+5*2)+3)/5+(-6)/4*2+3"; 231 232 cout<<evamidexpr(a)<<endl; 233 return 0; 234 }