C++算法与泛型算法(algorithm、numeric)

2020-02-20 12:00:58王冬梅

四、写算法

可以读写容器内的元素,但不可以改变容器的大小。因此操作时要注意容器的大小(例如不能对空容器操作)

因为会改变值,所以不能使用只读迭代器(cbegin()、cend())

fill()

用来改变指定位置处的元素 参数:参数1、2指定容器的范围,参数3位要设置的值
vector<int> vec{ 1,2,3,4,5 };
fill(vec.begin(), vec.end(), 0);//将vec全部置为0
for (auto v = vec.cbegin(); v != vec.cend(); v++)
	cout << *v << endl;
vector<int> vec{ 1,2,3,4,5,6 };
fill(vec.begin(), vec.begin()+vec.size()/2, 66); //将vec的前半部分元素变为66
 
for (auto v = vec.cbegin(); v != vec.cend(); v++)
	cout << *v << endl;

fill_n()

用来将指定数量的元素变为某个值 参数:参数1为迭代器起始位置。参数2为要改变的元素个数。参数3为要设定的值 注意:要注意参数2的设定,不能超出容器的大小,也不能对空容器操作
vector<int> vec{ 1,2,3,4,5,6 };
 
fill_n(vec.begin(), 3, 66); //将vec的前3个元素变为66
for (auto v = vec.cbegin(); v != vec.cend(); v++)
	cout << *v << endl;
 
fill_n(vec.begin(), vec.size(), 66); //将vec全部变为66
for (auto v = vec.cbegin(); v != vec.cend(); v++)
	cout << *v << endl;
//下面代码不会出错,但是也不会有效果,因为vec是空向量
 
vector<int> vec;
fill_n(vec.begin(), vec.size(), 66);
for (auto v = vec.cbegin(); v != vec.cend(); v++) //不打印任何信息
	cout << *v << endl;

back_inserter()

又名插入迭代器 参数:为一个容器的引用 返回值:返回与该容器绑定的插入迭代器 功能:常用来返回一个容器的迭代器,然后对此迭代器进行操作 当我们通过返回的插入迭代器赋值时,会自动调用push_back将一个具有给定值的元素添加到容器中 头文件iterator
vector<int> vec; //空容器
 
auto it = back_inserter(vec); //返回vec的第一个迭代器
*it = 42; //此时vec有了一个元素,值为42

现在我们可以使用fill_n来给一个空容器赋值:在每次迭代中,back_inserter返回迭代器,因此每次赋值都会在vec上调用push_back,因此fill_n就能够操作了。下面是在vec的末尾添加10个新的元素

vector<int> vec;
fill_n(back_inserter(vec), 10, 0);//通过back_inserter创建一个插入迭代器,然后可以向vec添加元素了
for (auto v = vec.cbegin(); v != vec.cend(); v++) //打印10个0
	cout << *v << endl;

copy()

将参数1、2指定范围的元素拷贝给参数3指定的容器 参数:参数1、2为一个容器的范围。参数3要接受拷贝的容器起始位置 注意:参数3要有足够的空间保存拷贝的数据 返回值:返回拷贝目的位置的迭代器值