c++ - 从 vector < vector <字符串>>中删除重复值,不区分大小写?由 小码哥发布于

标签 c++

嗨,我正在尝试从 vector 中删除重复的值。 它被设置为 vector 。这个 vector 包含一个 vector 列表,每个内部 vector 是3个字符串。

我尝试过:

removeCopies.erase( unique(removeCopies.begin(), removeCopies.end() ), removeCopies.end());

但它仍然在内部 vector 中留下一些字符串,例如:

mainVector: {
interiorVector1: string 1: "book", string 2: "noun", string3: "A book"
interiorVector2: string 1: "book", string 2: "noun", string3: "a BOok"
}

我也不能将其全部更改为小写,我无法编辑 vector 内部的值。

如果您需要更好的解释,请询问。谢谢。

编辑:

我试过了

unique(stringVec.begin(), stringVec.end(), [](const string &a, const string 
&b) { return lowercase(a) == lowercase(b); }), stringVec.end()

其中 lowercase() 将整个字符串转换为小写。但它不允许我访问内部 vector 字符串来执行此操作。

最佳答案

就像 std::sort , std::unique接受一个BinaryPredicate,在unique的情况下用于等于比较:

template< class ForwardIt, class BinaryPredicate >
constexpr ForwardIt unique( ForwardIt first, ForwardIt last, BinaryPredicate p );

如果您提供不区分大小写的谓词,那么它应该可以正常工作。我推荐boost::iequals如果您不想重新发明轮子。

以下代码不适用于您的特定嵌套 vector 示例,但如果 vector 内只有字符串,则生成的代码将类似于:

removeCopies.erase(std::unique(begin(removeCopies), end(removeCopies), boost::iequals), end(removeCopies));

就您而言,您可能需要编写自定义 lambda其内部使用 iequals 执行逐元素比较。

编辑:这是 iequals 的折扣版本:

bool iequals(const std::string& lhs, const std::string& rhs)
{
   if (lhs.size() != rhs.size())
      return false;
   for(size_t i = 0; i < lhs.size(); ++i)
   {
       if (std::tolower(lhs[i]) != std::tolower(rhs[i]))
          return false;
   }
   return true;
}

关于c++ - 从 vector < vector <字符串>>中删除重复值,不区分大小写?由 小码哥发布于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66446913/

相关文章:

c++ - 为什么 C++17 向命名空间和枚举器添加属性?

c++ - 使用 C++ 在多维 vector 中分配变量的最佳方法是什么?

c++ - 与size_t比较,返回int?

c++ - libc++ 无法处理 fcgi streambuf

c++ - 需要按插入顺序设置 STL

c++ - 使用 Qt 和 C++ 进行转换

c++ - 子字符串的二进制搜索树?

c++ - 具有动态优先级的 priority_queue

C++:在循环内部或外部声明一个 vector

c++ - 非 MFC CalcWindowRect()?