10.4 再探迭代器-插入/IO/反向

时间:2023-03-09 05:51:23
10.4 再探迭代器-插入/IO/反向

10.4.1 插入迭代器

插入迭代器接受一个容器,生成一个迭代器,通过向该迭代器赋值可以实现向容器添加元素 
(1)back_inserter: 
接受一个参数, 
示例: 
auto iter = back_inserter(iVec); 
iter = value; 
(2)front_inserter: 
接受一个参数, 
示例: 
auto iter = front_inserter(iVec); 
iter = value; 
(3)inserter: 
接受两个参数,示例:auto iter = inserter(iVec, it); //it必须是一个指向iVec的迭代器, 
iter = value; //将value插入到it之前

习题 10.28 三种插入迭代器的应用

int main()
{
int array[] = { ,,,,, };
vector<int> iVec(begin(array), end(array));
vector<int> iVec_back;
deque<int> iDeque_front;
list<int> iList_inserter; copy(iVec.begin(), iVec.end(), back_inserter(iVec_back));
copy(iVec.begin(), iVec.end(), front_inserter(iDeque_front));
copy(iVec.begin(), iVec.end(), inserter(iList_inserter, iList_inserter.begin())); system("pause");
}

习题10.27

int main()
{
int array[] = { -, , , , , -, , -, };
vector<int> iVec(begin(array), end(array));
vector<int> iVecUnique;
//元素排序,为拷贝不重复的元素做准备
stable_sort(iVec.begin(), iVec.end());
//拷贝不重复的元素到iVecUnique
unique_copy(iVec.begin(), iVec.end(), back_inserter(iVecUnique)); system("pause");
}

10.4.2 iostream迭代器

主要目的是使用算法操作流迭代器。

习题10.30 标准流迭代器的应用

int main()
{
istream_iterator<int> in_ite(cin); //定义输入流迭代器,并绑定标准输入流
istream_iterator<int> in_end; //定义尾后迭代器,没有数据读入时迭代器就为尾后迭代器
ostream_iterator<int> out_iter(cout); //定义输出流迭代器,并绑定标准输出流
vector<int> iVec;
copy(in_ite, in_end, back_inserter(iVec));
sort(iVec.begin(), iVec.end());//排序
copy(iVec.begin(), iVec.end(), out_iter);//输出到与 out_iter 绑定的标准输出设备
system("pause");
}

习题 10.29 使用流迭代器读取文件

int main()
{
ifstream ifstrm("h:\\1.txt"); //定义文件输入流
istream_iterator<string> in_iter(ifstrm); //定义IO类的输入迭代器,并绑定ifstrm
istream_iterator<string> in_end; //定义尾后迭代器,没有数据读入时迭代器就为尾后迭代器
vector<string> strVec;
copy(in_iter, in_end, back_inserter(strVec)); //利用copy算法将文件中的内容放到容器,以单词为组 system("pause");
}

10.4.3反向迭代器

//假定有一个名为 line 的string,保存着一个逗号分隔的单词列表,我们希望打印line中的第一个单词和最后一个单词,则分别用正向迭代器和逆向迭代器
int main()
{
string line = "first,middle,last";
auto comma = find(line.cbegin(), line.cend(), ','); //查找第一个逗号
cout << string(line.cbegin(), comma) << endl; //打印最后一个单词
auto rcomma = find(line.crbegin(), line.crend(), ','); //查找最后一个逗号
cout << string(line.crbegin(), rcomma) << endl; //错误,输出 tsal 是逆序的
//cout << string(rcomma, line.crbegin()) << endl; //错误,rcomma是一个逆向迭代器,而line.crbegin()返回尾后字符,所以会溢出
cout << string(rcomma.base(), line.end()) << endl; //正确,反向迭代器调用base()函数会返回普通迭代器,注意调用后指向不同的元素,会移动一位
system("pause");
}