写容器元素算法
2023年12月24日 2023年12月24日
将序列中元素设为相同值
序列表示方式有两种:
-
给出序列的所有元素, 使用迭代器范围: [b, e)
fill
-
给出序列首元素, 并给出元素个数: [dest, dest + n)
fill_n
假定序列包含n个元素
将序列中的元素设为给定值val
1fill(b, e, val); 2 3fill_n(dest, n, val);
fill算法
1// 将全部元素置0 2fill(vec.begin(), vec.end(), 0); 3 4// 将给定序列中的元素值设置为10 5fill(vec.begin(), vec.begin() + vec.size() / 2, 10);
fill_n算法
1vector<int> vec; 2 3fill_n(vec.begin(), 10, 0); // 错误:vec为空 4 5// 可以搭配插入迭代器使用
插入迭代器
back_inserter
使用back_inserter获取给定容器的插入迭代器
1C c; 2back_inserter(c);
fill和fill_n算法都假定序列有效, 用来给已有元素赋值. 实际使用中, 配合插入迭代器, 可以用来往容器中添加元素
使用插入迭代器添加元素
1vector<int> vec; 2auto it = back_inserter(vec); 3*it = 42; // 往vec插入一个元素,值为42
使用fill_n + 插入迭代器, 为容器添加元素
1vector<int> vec; 2fill_n(back_inserter(vec), 10, 0); // back_inserter返回插入迭代器,具有为容器添加元素的功能
拷贝序列
copy
给出序列1的所有元素, 使用迭代器范围: [b, e)
给出指向序列2首元素的迭代器
将序列2的元素设置为序列1对应位置元素的拷贝
返回dest + e - b位置的迭代器
1copy(b, e, dest);
示例
1int a1[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 2 3int a2[sizeof(a1)/sizeof(*a1)]; // a2的大小与a1一样 4 5auto ret = copy(begin(a1), end(a1), a2); 6// ret为a2 + 10
将序列中匹配给定值的元素设置为新值
replace
给出序列的所有元素, 使用迭代器范围: [b, e)
匹配值val1, 新值val2
1replace(b, e, val1, val2);
示例
1replace(ilst.begin(), ilst.end(), 0, 42);
构造新序列: 将原序列匹配给定值的元素替换为新值
replace_copy
1replace_copy(b, e, inserter, val1, val2);
示例
遍历ilst:
- 如果元素值不为val1,原值写入it
- 如果元素值为val1,将val2写入it
ilst的元素未发生改变, ivec存放新序列
1replace_copy(ilst.cbegin(), ilst.cend(), back_inserter(ivec), 0, 42);