如何使用 std::unique 删除向量中的唯一字符(C++)

0 c++ stl

我需要删除向量中的唯一字符, 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)

Fur*_*ish 5

编辑:这个答案适用于问题的先前版本,稍微不清楚。有关当前问题的答案,请参阅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。所有独特的元素已被删除