六一的部落格


关关难过关关过,前路漫漫亦灿灿。




将序列中元素设为相同值

序列表示方式有两种:

  1. 给出序列的所有元素, 使用迭代器范围: [b, e)

    fill

  2. 给出序列首元素, 并给出元素个数: [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);

写容器元素算法



将序列中元素设为相同值

序列表示方式有两种:

  1. 给出序列的所有元素, 使用迭代器范围: [b, e)

    fill

  2. 给出序列首元素, 并给出元素个数: [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);