练习 9.23:
在本节第一个程序(第309页)中,做c .size()为1,则val, val2, val3,和val4的值会是什么?
解答:
如果这几个值都合法存在,val2和val4相等,val指向的是容器内第一个值,val3指向的是一个非法的地址,在容器最后一个元素之外的地址。
练习9.24:
编写程序,分别使用at、下标运算符、front和begin提取一个vector中的第一个元素。在一个空vector上测试你的程序。
解答:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec{ 1, 2, 3, 4, 5, 6 };
cout << vec[0] << endl;
cout << vec.at(0) << endl;
cout << vec.front() << endl;
cout << *vec.begin() << endl;
}
练习9.25:
对于第312页中删除一个范围内的元素的程序,如果elem1与elem2相等会发生什么?如果elem2是尾后迭代器,或者elem1和elem2皆为尾后迭代器,又会发生什么?
解答:
①相等的时候不会删除任何元素。
②参考cppreference
iterator erase (const_iterator first, const_iterator last);当只有elem2为尾后迭代器的时候,程序编译会出错。因为尾后迭代器和普通迭代器属于不同的类型。
③与②的情况相同。
PS. 这里也可能和我使用的编译器有关系,这道题我用的VS2013来进行的。
练习9.26:
使用跟下面代码定义的ia,将ia拷贝到一个vector和一个list中。使用但迭代器版本的erase从list中删除奇数元素,从vector中删除偶数元素。
int ia[] = {0, 1, 1, 2, 3 , 5, 8, 13, 21, 55, 89};
解答:
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
using namespace std;
void OddVessel(vector<int>& vec){
vector<int>::iterator iter = vec.begin();
while (iter != vec.end()){
if (*iter % 2){
++iter;
}
else {
iter = vec.erase(iter);
}
}
}
void EvenVesse(list<int>& li){
list<int>::iterator iter = li.begin();
while (iter != li.end()){
if (*iter % 2){
iter = li.erase(iter);
}
else {
++iter;
}
}
}
int main() {
int ia[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 55, 89 };
auto first = begin(ia);
auto last = end(ia);
vector<int> ivec(first, last);
cout << "The original vector elements:" << endl;
for (auto i : ivec){
cout << i << " ";
}
cout << endl;
list<int> ilist(first, last);
cout << "The original list elements:" << endl;
for (auto i : ilist){
cout << i << " ";
}
cout << endl;
OddVessel(ivec);
EvenVesse(ilist);
cout << "The Odd vector elements:" << endl;
for (auto i : ivec){
cout << i << " ";
}
cout << endl;
cout << "The Even list elements:" << endl;
for (auto i : ilist){
cout << i << " ";
}
cout << endl;
}