9.3.1节练习

顺序容器常规操作总结:

1.相等比较(== 和 !=):所有顺序容器都支持的操作。

2.关系运算(< >等):需要满足条件 1.容器和数据类型都一样。2.数据类型支持比较操作。对容器类型没有限制

3.初始化:

练习9.18:编写程序,从标准输入读取string序列,存入一个deque中。编写一个循环,用迭代器打印deque中的元素。

deque<string> ss;
string temp;
while(cin>>temp){
    ss.push_back(temp);
}
for(deque<string>::iterator itb=ss.begin();itb != ss.end(); itb++){
    cout<< *itb << endl;
}

练习9.19:重写上题程序,用list代替deque。列出程序要作出哪些改变?

list<string> ss;
string temp;
while(cin>>temp){
    ss.push_back(temp);
}
for(deque<string>::iterator itb=ss.begin();itb != ss.end(); itb++){
    cout<< *itb << endl;
}

练习9.20:编写程序,从一个list<int>拷贝元素到两个deque中。值为偶数的所有元素都拷贝到一个deque中,而奇数值元素都拷贝到另一个deque中。

list<int> ss = {1,2,3,4,5,6,7,8,9,10};
deque<int> s_ou;
deque<int> s_ji;
int count=1;
for(list<int>::iterator it1 = ss.begin();it1!=ss.end();it1++,count++){
    if(count%2==0)
        s_ou.push_back(*it1);
    else
        s_ji.push_back(*it1);
}

练习9.21:如果我们将第308页中使用insert返回值将元素添加到list中的循环程序改写为将元素插入到vector中,分析循环将如何工作。

vector<int> s;
auto it1=s.begin();
int temp;
while(cin>>temp){
    it1=s.insert(it1,word);
}

分析 :insert()函数  第一个参数是一个迭代器,插入的位置是这个迭代器指向的位置的前面。

典型用法:

vector<string> v = {"quasi", "simba", "frollo", "scar"};
//将v的最后两个元素添加到slist的开始位置。
slist.insert(slist.begin(); v.end()-2; v.end());
//在slist的后面添加元素。
slist.insert(slist.begin(); {"aaa","bbb","ccc"});

上面的循环每次都将返回指向刚插入的那个元素的迭代器,刚插入的那个元素每次都是第一个。

练习9.22:假定iv是一个int的vector,下面的程序存在什么错误?你将如何修改?

vector<int>::iterator iter = iv.begin(),

                                         mid = iv.begin() + iv.size()/2;

while(iter != mid)

       if (*iter == some_val)

            iv.insert(iter, 2 * some_val);

分析:1.上述代码 没有自加,迭代器指向的位置不会改变

2.另外,如果容器大小发生改变 迭代器由于没有更新会失效。就像下面的代码:

	int some_val = 2;
	vector<int> iv = { 1, 2, 3, 4, 5 };
	vector<int>::iterator iter = iv.begin(),

		mid = iv.begin() + iv.size() / 2;

	while (iter != mid){
		if (*iter == some_val)
			iv.insert(iter, 2 * some_val);
		iter++; //当迭代器长度改变时,此处将中断,原因是迭代器失效。
	}

猜你喜欢

转载自blog.csdn.net/xnnswmzdszyd/article/details/89640067