copy(iterator beg, iterator end, iterator dest);
// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
// beg 开始迭代器
// end 结束迭代器
// dest 目标起始迭代器
#include
#include
#include
int main() {
std::vector source {1, 2, 3, 4, 5};
std::vector destination(5); // 提前开辟目标容器空间
std::copy(source.begin(), source.end(), destination.begin());
// 输出目标容器中的内容
for (auto i : destination) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为:1 2 3 4 5
在上面的示例中,我们首先创建了一个源容器source,其中包含了一些整数。然后,我们创建了一个与源容器相同大小的目标容器destination,并且提前开辟了空间。
接下来,我们使用std::copy算法将源容器中的元素拷贝到目标容器中。通过传递源容器的迭代器source.begin()和source.end()以及目标容器的起始迭代器destination.begin()作为参数,实现了拷贝操作。
最后,遍历目标容器,并打印其中的元素
replace(iterator beg, iterator end, oldvalue, newvalue);
// 将区间内旧元素 替换成 新元素
// beg 开始迭代器
// end 结束迭代器
// oldvalue 旧元素
// newvalue 新元素
#include
#include
#include
int main() {
std::vector vec {1, 2, 3, 4, 5};
std::replace(vec.begin(), vec.end(), 3, 9);
// 输出修改后的容器内容
for (auto i : vec) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为:
1 2 9 4 5
在上面的示例中,我们首先创建了一个整数向量vec,其中包含了一些整数。然后,我们使用std::replace算法将容器中的旧元素3替换为新元素9。
通过传递容器的起始迭代器vec.begin()和结束迭代器vec.end()作为参数,以及要替换的旧元素3和新元素9,实现了替换操作。
最后,我们遍历容器,并打印其中的元素,可以看到被替换的元素已经被修改为新元素。
**replace_if(iterator beg, iterator end, _pred, newvalue);
**
// 按条件替换元素,满足条件的替换成指定元素
// beg 开始迭代器
// end 结束迭代器
// _pred
谓词
,谓词函数是一个返回布尔值的函数,用于确定元素是否满足某个条件。
// 注意谓语是返回bool的仿函数,是谓词,是一个类,不是函数,但是可以当函数用
// 因此可以利用仿函数灵活筛选满足的条件
// newvalue 替换的新元素
示例:
#include
#include
#include
int main() {
std::vector vec {1, 2, 3, 4, 5};
std::replace_if(vec.begin(), vec.end(), [](int num){ return num == 3; }, 9);
// 输出修改后的容器内容
for (auto i : vec) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为:
1 2 9 4 5
在这个示例中,我们使用了一个匿名的lambda函数作为谓词函数来判断元素是否需要被替换。lambda函数接受一个整数参数num,并返回一个bool值,判断这个整数是否等于3。如果等于3,则将其替换为新元素9。
通过使用lambda函数作为谓词函数,我们可以自定义替换的条件。在上述示例中,我们使用等于3的元素作为替换的条件。
需要注意的是,replace_if函数只会替换满足条件的第一个元素,如果想要替换所有满足条件的元素,可以考虑使用std::replace_copy_if或自定义循环进行处理。
swap(container c1, container c2);
// 互换两个容器的元素
// c1容器1
// c2容器2
交换不同类型的容器,将会导致编译错误。
要交换的容器类型要相同,或者满足可以进行隐式转换的条件。例如,两个
std::vector
可以直接交换,但是std::vector
和std::vector
之间不能直接交换。
交换容器时,要确保容器处于有效状态,即它们不应被移动、释放或销毁。否则,交换操作可能会导致未定义行为。
交换容器后,原来容器中的迭代器将会失效。如果有其他依赖于这些迭代器的代码,则需要谨慎处理,避免使用失效的迭代器。
交换容器实际上是交换了它们的内部数据结构,这意味着会涉及到元素的复制或移动操作。如果容器的大小较大,交换操作可能会带来显著的内存开销和性能损失。
交换容器可能会引发异常,因此在交换操作之前,要考虑异常安全性,采取适当的措施来处理异常,以确保程序能够正常执行。
#include
#include
#include
int main() {
std::vector vec1 {1, 2, 3};
std::vector vec2 {4, 5, 6};
swap(vec1, vec2);
// 输出交换后的vec1
std::cout << "vec1: ";
for (auto i : vec1) {
std::cout << i << " ";
}
std::cout << std::endl;
// 输出交换后的vec2
std::cout << "vec2: ";
for (auto i : vec2) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为:
vec1: 4 5 6
vec2: 1 2 3
在这个示例中,我们创建了两个vector类型的容器vec1和vec2。
然后,通过调用swap函数来交换这两个容器的元素。最
终,vec1中的元素变成了4, 5, 6,vec2中的元素变成了1, 2, 3。
#include
accumulate(iterator beg, iterator end, value);
// 计算容器元素累计总和
// beg 开始迭代器
// end 结束迭代器
// value 起始值
//起始值value是可选的,如果不提供该参数,那么默认起始值将是容器中的第一个元素的值。(看下面例子)
所以,在使用accumulate函数时,建议在累加之前检查容器是否非空,或者提供一个明确的起始值参数。
#include
#include
#include
int main() {
std::vector vec {1, 2, 3, 4, 5};
int sum = std::accumulate(vec.begin(), vec.end());
std::cout << "Sum: " << sum << std::endl;
return 0;
}
输出结果为:
Sum: 15
在这个示例中,我们调用了accumulate函数来计算容器vec中元素的累计总和,但没有提供起始值参数。由于没有指定起始值,accumulate函数会使用容器中的第一个元素作为起始值进行累加运算。
因此,根据示例中的容器vec,累计总和仍然是15。
fill(iterator beg, iterator end, value);
// 向容器中填充元素
// beg 开始迭代器
// end 结束迭代器
// value 填充的值
#include
#include
#include
int main() {
std::vector vec {1, 2, 3, 4, 5};
std::fill(vec.begin(), vec.end(), 10);
// 输出填充后的向量
std::cout << "Filled Vector: ";
for (auto i : vec) {
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为:
Filled Vector: 10 10 10 10 10
在这个示例中,我们有一个包含初始值的向量vec,其中包含了数字1到5。然后,我们使用fill函数将容器vec中的所有元素都填充为10。
最终的输出结果显示,原本向量中的元素已经被覆盖,全部变成了10, 10, 10, 10, 10。
因此,需要注意,在使用fill函数时,如果你希望保留原有元素的值,只填充指定范围内的部分元素,可以使用更具灵活性的方法,如迭代器和算法结合使用来实现部分填充。
set_intersection
函数通常用于计算两个有序集合的交集。
但是,它实际上可以用于任何支持随机访问的序列容器,而不仅限于集合。
set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
示例:
#include
#include
#include
int main() {
std::vector vec1 {1, 2, 3, 4, 5};
std::vector vec2 {3, 4, 5, 6, 7};
std::vector intersection(std::min(vec1.size(), vec2.size()));
auto it = std::set_intersection(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), intersection.begin());
// 输出交集中的元素
std::cout << "Intersection: ";
for (auto i = intersection.begin(); i != it; ++i) {
std::cout << *i << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为:
Intersection: 3 4 5
在这个示例中,我们有两个有序的向量vec1和vec2,分别包含了不同的整数。我们需要找出这两个向量的交集。
首先,我们创建了一个目标容器intersection,它的大小为两个输入容器中较小的那个。
然后,使用set_intersection函数将两个输入容器中的交集复制到目标容器intersection中。set_intersection函数接受五个参数,分别是两个输入容器的起始和结束迭代器,以及目标容器的起始迭代器。这样,交集中的元素就会复制到目标容器中。
最后,我们遍历目标容器中的元素,并输出交集中的值。
set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
// beg1 容器1开始迭代器
// end1 容器1结束迭代器
// beg2 容器2开始迭代器
// end2 容器2结束迭代器
// dest 目标容器开始迭代器
#include
#include
#include
int main() {
std::vector vec1 {1, 2, 3, 4, 5};
std::vector vec2 {3, 4, 5, 6, 7};
std::vector unionSet(vec1.size() + vec2.size());
auto it = std::set_union(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), unionSet.begin());
// 输出并集中的元素
std::cout << "Union: ";
for (auto i = unionSet.begin(); i != it; ++i) {
std::cout << *i << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为:
Union: 1 2 3 4 5 6 7
在这个示例中,我们有两个有序的向量vec1和vec2,分别包含了不同的整数。我们需要找出这两个向量的并集。
首先,我们创建了一个目标容器unionSet,它的大小为两个输入容器的总大小。
然后,使用set_union函数将两个输入容器中的并集复制到目标容器unionSet中。
set_union函数接受五个参数,分别是两个输入容器的起始和结束迭代器,以及目标容器的起始迭代器。这样,并集中的元素就会复制到目标容器中。
最后,我们遍历目标容器中的元素,并输出并集中的值。
set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest);
// beg1 容器1开始迭代器
// end1 容器1结束迭代器
// beg2 容器2开始迭代器
// end2 容器2结束迭代器
// dest 目标容器开始迭代器
示例:
#include
#include
#include
int main() {
std::vector vec1 {1, 2, 3, 4, 5};
std::vector vec2 {3, 4, 5, 6, 7};
std::vector difference(std::max(vec1.size(), vec2.size()));
auto it = std::set_difference(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), difference.begin());
// 输出差集中的元素
std::cout << "Difference: ";
for (auto i = difference.begin(); i != it; ++i) {
std::cout << *i << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为:
Difference: 1 2
在这个示例中,我们有两个有序的向量vec1和vec2,分别包含了不同的整数。我们需要找出这两个向量的差集。
首先,我们创建了一个目标容器difference,它的大小为两个输入容器中较大的那个。
然后,使用set_difference函数将两个输入容器中的差集复制到目标容器difference中。
set_difference函数接受五个参数,分别是两个输入容器的起始和结束迭代器,以及目标容器的起始迭代器。这样,差集中的元素就会复制到目标容器中。
最后,我们遍历目标容器中的元素,并输出差集中的值。