给定一个字符串数组,如何删除重复项?

Given an Array of strings how do I Remove Duplicates?

本文关键字:何删除 删除 数组 一个 字符串      更新时间:2023-10-16

我想知道如何从容器中删除重复的字符串,但忽略尾随标点符号中的单词差异。

例如,给定这些字符串:

我们为什么在这里?

我想得到这个输出:

我们为什么在这里?

算法:

  1. 当朗读单词成功时,请执行以下操作:
  2. 如果文件结束,请退出。
  3. 如果单词列表为空,请推回单词。
  4. 否则开始
    搜索单词列表以获取单词。
  5. 如果单词不存在,请推回单词。
    结束其他(步骤 4(
  6. 结束(阅读单词时(

std::string来表达你的话。 这允许您执行以下操作:

std::string word;
while (data_file >> word)
{
}

使用std::vector来包含您的单词(尽管您也可以使用std::list(。std::vector动态增长,因此如果选择了错误的大小,则不必担心重新分配。
若要追加到std::vector,请使用push_back方法。

要比较std::string,请使用operator==

std::string new_word;
std::vector<std::string> word_list;
//...
if (word_list[index] == new_word)
{
continue;
}

所以你说过你知道如何标记字符串。(如果你不在这里花一些时间:https://stackoverflow.com/a/38595708/2642059(所以我假设我们得到了一个vector<string> foo,其中包含可能带有尾随标点符号的单词。

for(auto it = cbegin(foo); it != cend(foo); ++it) {
if(none_of(next(it), cend(foo), [&](const auto& i) {
const auto finish = mismatch(cbegin(*it), cend(*it), cbegin(i), cend(i));
return (finish.first == cend(*it) || !isalnum(*finish.first)) && (finish.second == cend(i) || !isalnum(*finish.second));
})) {
cout << *it << ' ';
}
}

现场示例

这里值得注意的是,您还没有给我们关于如何处理诸如"反对"、"反对"和"反对"等词的规则,该算法假定 1st2 是相等的。你也没有给我们如何处理的规则:"为什么,我们在这里,在这里?此算法始终返回最后的重复,因此输出将是"我们为什么在这里?

如果此算法所做的假设不完全符合您的喜好,请给我留言,我们将努力让您熟悉此代码,以便您可以进行所需的调整。