10.1
#include<iostream> #include<vector> #include<algorithm> #include<fstream> using namespace std; int main(int argc,const char*argv[]){ /*ifstream in(argv[1]); if(!in){ cout << "打开输入文件失败" << endl; exit(1); }*/ //这一段的含义完全没有看懂 vector<int> nums; int number; while (cin >> number) { nums.push_back(number); } cout << count(nums.begin(),nums.end(),4) << endl; return 0; }
困惑:
这一段程序的含义没有看懂
ifstream in(argv[1]); if(!in){ cout << "打开输入文件失败" << endl; exit(1); }
10.5
#include<iostream> #include<vector> #include<algorithm> #include<fstream> #include<string> #include<list> #include<numeric> #include<string.h> using namespace std; int main(void){ char *p[] = {"Hello","World","!"}; char *q[] = {strdup(p[0]),strdup(p[1]),strdup(p[2])}; //strdup()为字符串拷贝函数,为复制的字符串分配空间,返回分配空间后的指针 //不再使用该空间之后,要使用函数free()释放分配的内存 char *r[] = {p[0],p[1],p[2]}; cout << equal(begin(p),end(p),q) << endl; cout << equal(begin(p),end(p),r) << endl; //begin()返回的是数组首元素指针,end()返回的是数组尾部元素的指针 return 0; }
10.27
#include<iostream> #include<vector> #include<list> #include<algorithm> #include<iterator> using namespace std; int main(void){ vector<int> nums; int number; while (cin >> number) { nums.push_back(number); } sort(nums.begin(),nums.end()); // int size = nums.size(); //list<int> lt(size); // unique_copy(nums.begin(),nums.end(),lt.begin); //纠结了好久不知道该如何确定lt容器的大小 list<int> lt; unique_copy(nums.begin(),nums.end(),back_inserter(lt)); for(auto v : lt){ cout << v << " "; } cout << endl; return 0; }
begin()、end()之类的迭代器指明了元素的位置,不能够是实现插入,back_inserter()之类的函数既能够指明位置又能够实现插入。
10.28
#include<iostream> #include<vector> #include<list> #include<algorithm> #include<iterator> using namespace std; int main(void){ vector<int> nums = {1,2,3,4,5,6,7,8,9}; list<int> lt1,lt2,lt3; copy(nums.begin(),nums.end(),front_inserter(lt1)); copy(nums.begin(),nums.end(),back_inserter(lt2)); copy(nums.begin(),nums.end(),inserter(lt3,lt3.begin())); for(auto it1 = lt1.begin();it1 != lt1.end();it1++){ cout << *it1; } cout << endl; for(auto it2 = lt2.begin();it2 != lt2.end();it2++){ cout << *it2; } cout << endl; for(auto it3 = lt3.begin();it3 != lt3.end();it3++){ cout << *it3; } cout << endl; return 0; }
front_iterator ()向容器中添加元素是倒着添加的。
10.34
#include<iostream> #include<vector> #include<list> #include<algorithm> #include<iterator> using namespace std; int main(void){ vector<int> nums = {1,2,3,4,5,6,7,8,9}; // vector<int>::reverse_iterator it; for(auto it = nums.rbegin();it != nums.rend();it++){ cout << *it; } cout << endl; }
10.35
#include<iostream> #include<vector> #include<list> #include<algorithm> #include<iterator> using namespace std; int main(void){ vector<int> nums = {1,2,3,4,5,6,7,8,9}; // vector<int>::reverse_iterator it; for(auto it = nums.end()-1;it != nums.begin()-1;it--){ cout << *it; } cout << endl; //答案的做法 for(auto r_it = nums.end();r_it != nums.begin();){ cout << *(--r_it); //先减小后输出 } cout << endl; }
10.36
#include<iostream> #include<vector> #include<list> #include<algorithm> #include<iterator> using namespace std; int main(void){ list<int> nums = {1,2,0,4,5,0,7,0,9}; auto last_z = find(nums.rbegin(),nums.rend(),0); //如何知道反向迭代器指向的是第几个 last_z++;//保证使用正向迭代器的时候,能够指向最后一个0 //int p = 0;这个的初始化不对,移动的次数会比所有的元素的个数少一 int p = 1; for(auto it = nums.begin();it != last_z.base();it++){ p++; } if(p >= nums.size()) cout << "不存在0" << endl; else cout << "the position of last zore is " << p << endl; return 0; }
10.37
#include<iostream> #include<vector> #include<list> #include<algorithm> #include<iterator> using namespace std; int main(void){ ostream_iterator<int> out_iter(cout," "); //don't understand vector<int> vi = {0,1,2,3,4,5,6,7,8,9}; copy(vi.begin(),vi.end(),out_iter); cout << endl; list<int> li; vector<int>::reverse_iterator re(vi.begin()+2); //using iterator to initialize reverse iterator vector<int>::reverse_iterator rb(vi.begin()+7); copy(rb,re,back_inserter(li)); copy(li.begin(),li.end(),out_iter); cout << endl; return 0; } /*int main(void){ vector<int> nums = {1,2,3,4,5,6,7,8,9,10}; list<int> lt; copy(nums.rbegin()+3,nums.rbegin()+8,back_inserter(lt)); //拷贝数字【3,7】,由于copy为左开右闭区间,应该加上的数字为8 for(auto it = lt.begin();it != lt.end();it++){ cout << *it; } cout << endl; return 0; }*/
1)ostream_iterator (os,str)
将T类型的元素输出到输出流中,每个元素后面追加一个C元素风格的字符串,
2)可以用正向迭代器初始化反向迭代器,其效果等同于将迭代器所指向的位置向前移动一位
10.38
列出五个迭代器的类别,以及每个迭代器所支持的操作。
1、输入迭代器——用于读取迭代器所指向的元素的内容
1)能够进行迭代器之间的比较。(用于确定输入和输出的范围)
2)能够进行解引用,通过指针获取元素具体的内容
3)能够通过递增和递减元素进行位置的移动
(确定范围,移动位置,解引用获取具体的内容)
2、输出迭代器——用于向容器内写入指定元素
1)能够通过递增和递减来进行定位,确定输入元素的位置
2)解引用运算符,指定其输入的位置
3、向前迭代器——支持单向扫描元素(如果从后向前也算是单向迭代器吗?
1)输入和输出的迭代器的操作都支持
2)只能单向读写元素
4、双向迭代器——能够双向读写元素
1)除了forward_list,其他容器都支持双向迭代器
5、随机访问迭代器——随机读写元素
1)具有能够比较两个迭代器关系的比较操作符
2)迭代器能够与数字相加减
3)迭代器之间能够相减得到相对的距离
4)具有下标运算符
不明白