给定一个字符串数组,如何删除重复项?
Given an Array of strings how do I Remove Duplicates?
我想知道如何从容器中删除重复的字符串,但忽略尾随标点符号中的单词差异。
例如,给定这些字符串:
我们为什么在这里?
我想得到这个输出:
我们为什么在这里?
算法:
- 当朗读单词成功时,请执行以下操作:
- 如果文件结束,请退出。
- 如果单词列表为空,请推回单词。
- 否则开始
搜索单词列表以获取单词。 - 如果单词不存在,请推回单词。
结束其他(步骤 4( - 结束(阅读单词时(
用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 是相等的。你也没有给我们如何处理的规则:"为什么,我们在这里,在这里?此算法始终返回最后的重复,因此输出将是"我们为什么在这里?
如果此算法所做的假设不完全符合您的喜好,请给我留言,我们将努力让您熟悉此代码,以便您可以进行所需的调整。
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 擦除删除成语的性能增益从何而来
- 重载运算符 new/new[] 删除/删除[] 全局C++
- 使用删除 [] 删除由 new [] 创建的数组
- BST 删除/删除节点 - 根
- C++ 使用删除 [] 删除指针
- 删除/删除矢量项的最有效/最快方法
- 删除删除/删除[]
- 使用 std::删除删除错误的字符