删除字符串向量中前 2 个字符的重复项

Posted

技术标签:

【中文标题】删除字符串向量中前 2 个字符的重复项【英文标题】:Erase duplicate of first 2 char in vector of strings 【发布时间】:2019-07-01 15:17:26 【问题描述】:

我有一个包含这种格式元素的字符串向量:$A,1,2,3,4 我想仅根据前 2 个字符 $A 删除重复的字符串。

#include <iostream>
#include <vector>
#include <algorithm>

int main()

    std::vector<std::string> vec;

    vec.push_back("$A,1,2,3,4");
    vec.push_back("$B,1,6,8,1");
    vec.push_back("$A,1,2,5,9");

    std::sort(vec.begin(), vec.end());

    vec.erase(std::unique(vec.begin(), vec.end()), vec.end());

    for(auto &entry: vec)
        std::cout << entry << std::endl;


    return 0;


我想在我的向量中只保留一个以$A开头的字符串,但这段代码是比较整个字符串是否唯一。

例如:如果字符串是$A...; $B...; $A...; $B...,则输出将是$A...; $B...

【问题讨论】:

我想我误读了这个问题。如果您有第二个以$B 开头的字符串,您是否也希望只保留其中一个字符串? 是的,如果有第二个字符串以$B 开头,我想删除它 std::unordered_map&lt;std::string, std::vector&lt;int&gt;&gt; ? 如果 some_string 的第一部分已经在 vec 中,为什么不使用 vec.push_back(some_string)。 @Juju ... 如果您将键 ($A, $B, ...) 与值分开并使用 mapunordered_map,则检查是内置的所以如果你尝试插入一个已经存在的键,它会报告它没有插入它。 【参考方案1】:

使用正确的谓词(与带有排序的谓词兼容),例如:

vec.erase(std::unique(vec.begin(), vec.end(),
                      [](const std::string& lhs, const std::string& rhs)
                          return lhs.substr(0, 2) == rhs.substr(0, 2);
                      ),
          vec.end());

【讨论】:

以上是关于删除字符串向量中前 2 个字符的重复项的主要内容,如果未能解决你的问题,请参考以下文章

删除字符串算法中的重复项

JavaScript 数组删除重复的单词或字符(如果只输入字符。不要从 1 个单词中删除所有重复项

Leetcode 1209 删除字符串中的所有相邻重复项 II

1209.删除字符串中的所有相邻重复项 II[待优化]

从包含 R 中特定字符的字符串向量中删除条目 [重复]

将字符向量转换为单个字符串[重复]