我需要删除向量中的唯一字符,
v.erase(unique(v.begin(),v.end()));
这有什么问题。
输入:wxwwm
输出:wxm
`vector<string>v;
string s;
cin >>s;
v.push_back(s);
v.erase(unique(v.begin(),v.end()),v.end());
for(auto i=v.begin();i!=v.end();i++)
{
cout <<*i;
}`
Run Code Online (Sandbox Code Playgroud)
编辑:这个答案适用于问题的先前版本,稍微不清楚。有关当前问题的答案,请参阅Caleth 的回答。
std::unique删除相邻的重复项(实际上将它们推到给定范围的末尾,使它们非常适合稍后使用 删除erase)。那不是你想要的。
如果您想删除唯一元素,那么我会提出一个基于计算不同元素出现次数的解决方案,并删除仅出现一次的元素。看看这个函数:
template <typename T>
void remove_unique(std::vector<T>& vec) {
std::map<T, int> occurrences {};
for(const auto& element : vec) {
occurrences[element]++;
}
const auto to_remove = std::remove_if(vec.begin(), vec.end(),
[&occurrences](const auto& element) {
return occurrences[element] == 1;
}
);
vec.erase(to_remove, vec.end());
}
Run Code Online (Sandbox Code Playgroud)
这将从包含任何类型的类型中删除所有唯一元素std::vector(假设它是可复制的)。
它使用 astd::map来计算向量中每个元素的出现次数,然后使用std::remove_if,这将(类似于std::unique)将满足特定条件的元素推到范围的末尾,以使它们适合实际删除。此示例中的某些标准是满足谓词 - lambda,它检查给定元素是否仅出现一次(此信息由我们的映射提供,我们在 lambda 中捕获)。之后,我们只需使用erasecall 删除这些元素即可。
用法:
int main() {
// two 2s and two 3s
std::vector<int> vec {1, 2, 4, 3, 0, 2, 9, 3};
remove_unique(vec);
for(const auto i : vec) {
std::cout << i << ' ';
}
}
Run Code Online (Sandbox Code Playgroud)
该程序的输出是:2 3 2 3。所有独特的元素已被删除