本博客知识记录自己学习中的笔记或者记录,如果有错误欢迎大家纠正。
本节初步了解泛型算法。
算法不能改变容器大小,切记
10.6编写程序,使用fill_n将一个序列中的int值都设置0
代码如下
#include <vector>
#include <string>
#include "stdlib.h"
#include <iostream>
int main()
{
std::vector<int> vec;//空容器
int i = 0;
while (std::cin >> i)
vec.push_back(i);
std::fill_n(vec.begin(), vec.size(), 0);
for (auto s:vec) //使用c++11新特性循环
std::cout << s;
system("pause");
return 0;
}
输出结果为
10.7是否有错
#include <vector>
#include <string>
#include <list>
#include "stdlib.h"
#include <iostream>
int main7_1()
{
//注意修改函数名为主函数名main
std::vector<int>vec;//空容器
std::list<int>lst;
int i;
while (std::cin >> i)
lst.push_back(i);
/************************************************************************/
//改正 保证目标容器vec.size()>=lst.size()
//1.
for (int k = 0; k < lst.size() ;k++)
vec.push_back(k);
//2.
std::fill_n(back_inserter(vec), lst.size(), 0);
//3.
vec.resize(lst.size());
//以上三种方式都可以做到vec.size()==lst.size();
/************************************************************************/
std::copy(lst.cbegin(), lst.cend(), vec.begin());
for (auto s : vec)
{
std::cout << s;
}
system("pause");
return 0;
}
int main7_2()
{
std::vector<int>vec;//空容器
vec.reserve(10);//该函数是 容器预留空间,但并不真正创建元素对象,所以该对象值还是为0
/************************************************************************/
int k = vec.size();//值还是为0,
vec.resize(10); //resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了
int k2 = vec.size();//值为10
/************************************************************************/
std::fill_n(vec.begin(), 10, 0);
for (auto s : vec)
std::cout << s;
system("pause");
return 0;
}
10.8本节提到,标准算法不会改变他们所操作的容器大小,为什么使用back_inserter不会使这一断言失效。
#include <vector>
#include <string>
#include <list>
#include "stdlib.h"
#include <iostream>
#include <iterator>
int main()
{
//算法不会改变他们所操作的容器大小,为什么使用back_inserter不会使这一断言失效
std::vector<int>vec;//空容器
auto it = back_inserter(vec);//通过它赋值会将元素添加到vec中
*it = 42;//vec中现在有一个元素,值为42
//back_inserter一个成员函数,返回值是back_insert_iterator, 本质上是push_back进行操作的,
//返回值back_insert_iterator, 并实现其自增.
fill_n(back_inserter(vec), 10, 0);
for (auto s : vec)
std::cout << s;
system("pause");
return 0;
}
在使用标准库算法的时候要记住 ,算法不能改变其操作容器的大小。