4.20
vector<string>::iterator iter;
*iter++;
(*iter)++;
*iter.empty();
iter->empty()
++*iter;
iter++->empty();
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<string> i = {"0","1","2","3"};
vector<string>::iterator iter;
for(iter = i.begin(); iter != i.end(); )
{
cout << *iter++ <<endl;
}
}
表达式合理,输出0 1 2 3,表达式的含义是取迭代器指向的参数的值,迭代器向后移一位.
- (a)合法。返回迭代器所指向的元素,然后迭代器递增。
- (b)不合法。因为
vector
元素类型是string
,没有++
操作。 - (c)不合法。这里应该加括号,变为(*iter).empty()。
- (d)合法。判断迭代器当前的元素是否为空。
- (e)不合法。
string
类型没有++
操作。 - (f)合法。判断迭代器当前元素是否为空,然后迭代器递增。
4.21.
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> shuZu = {0,1,2,3,4,5,6,7,8,9,10};
vector<int>::iterator iter;
for(iter = shuZu.begin(); iter != shuZu.end(); iter++)
{
if((*iter)%2 == 1)
{
*iter = 2*(*iter);
}
cout << *iter << endl;
}
}
4.22
(1)
#include <string>
#include <iostream>
using namespace std;
int main()
{
int grade;
string finalgrade;
cin >> grade;
finalgrade = (grade >= 90 ) ? "high pass" :(grade >= 75) ? "pass" :(grade >= 60) ? "low pass" :"failed";
cout << finalgrade << endl;
system("pause");
}
(2)
#include <string>
#include <iostream>
using namespace std;
int main()
{
int grade;
string finalgrade;
cin >> grade;
if(grade >= 90)
{
finalgrade = "high pass";
}
if(grade >= 75 && grade < 90)
{
finalgrade = "pass";
}
if(grade >= 60 && grade < 75)
{
finalgrade = "low pass";
}
if(grade < 60)
{
finalgrade = "fail";
}
cout << finalgrade << endl;
system("pause");
}
4.23 由于这一条表达式中 == 的优先级高于 = ,所以会先做 == ,就会造成把bool型赋给string的错误,+运算时这条表达式中优先级最高的所以改为
string p1 = s +(s[s.size()-1] == 's' ? "" : "s");
4.24
如果条件运算符满足的是左结合律。那么
finalgrade = (grade > 90) ? "high pass" : (grade <60 ) ? "fail" :"pass";
等同于
finalgrade = ((grade > 90) ? "high pass" : (grade < 60)) ? "fail" : "pass";
假如此时 grade > 90
,第一个条件表达式的结果是 "high pass"
,而字符串字面值的类型是 const char *
,非空所以为真。因此第二个条件表达式的结果是 "fail"
。这样就出现了自相矛盾的逻辑。