嗨,我正在尝试从 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/