因博主工作经验有限,只能通过有限的使用场景来介绍该特性
https://en.cppreference.com/w/cpp/algorithm/unique_copy
使用场景
将一些元素拷贝到另一个地方,可以定义重复的规则,拷贝出来之后是不带有连续相同元素的元素集合
如果需要使用std::unique_copy
,需要包含头文件#include <algorithm>
支持情况如下:
参数
first, last - 想要处理的元素始末位置
d_first - 目标存储位置(开始放置结果的开始位置)
policy - 执行策略
p - 规则,当返回为true时表示两个元素重复
示例
1. 自定义判重逻辑
cppreference给出的示例:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
int main()
{
std::string s1 {"The string with many spaces!"};
std::cout << "before: " << s1 << '\n';
std::string s2;
std::unique_copy(s1.begin(), s1.end(), std::back_inserter(s2),
[](char c1, char c2) { return c1 == ' ' && c2 == ' '; });
std::cout << "after: " << s2 << '\n';
}
在这里是将字符串s1
中的内容拷贝到字符串s2
当中,当两个字符均为空格的时候,标识为重复,返回true,执行结果为:
before: The string with many spaces!
after: The string with many spaces!
在拷贝的时候将连续且重复的空格去除掉了
2. 有默认的判重逻辑
如果为int等这种可以比较是否相等的元素,可以只写参数中的前两行:
first, last - 想要处理的元素始末位置
d_first - 目标存储位置(开始放置结果的开始位置)
示例如下:
#include <algorithm>
#include <iostream>
int main()
{
std::vector<int> v{1, 1, 2, 2, 3, 3, 4, 4, 5, 5};
std::vector<int> distVec;
std::unique_copy(v.begin(), v.end(), std::back_inserter(distVec));
for(const auto& t : distVec)
{
std::cout << t << " ";
}
return 0;
}
输出结果如下:
1 2 3 4 5