gpt4 book ai didi

c++ - (C++ Boost) 在列表中查找成员与搜索词匹配的项目

转载 作者:行者123 更新时间:2023-11-30 02:57:11 25 4
gpt4 key购买 nike

有没有一种很好的方法可以将以下代码简化为包含 C++ 和可能的 boost 库的单行代码。我基本上有一个以 title() 作为成员函数的消息列表。我想知道列表中是否存在具有给定标题的消息。

std::string title = "some title";
bool unique = true;

BOOST_FOREACH(Message& m, messages) {
if (m.title() == title) {
unique = false;
break;
}
}

如果您熟悉 C# Linq,那么下面的 C++ 版本会很棒:

unique = (messages.FirstOrDefault(m => m.title() == title) == null);

很遗憾,我不能使用 C++11,但如果您有 C++11 示例,我将有兴趣查看它以供将来引用。

提前致谢。

最佳答案

至少从外观上看,您可能希望使用 std::map 来存储按标题键入的消息:

std::map<std::string, Message> messages;

...在这种情况下,您的搜索将变成:

bool unique = messages.find(title) == messages.end();

如果你坚持做一个线性搜索,并且想保持你当前的状态,titleMessage 的成员,你可以这样做:

bool unique = std::find(messages.begin(), messages.end(),
[title](Message const &m) { return m.title == title; })
== messages.end();

但是,您可能不想做以上任何事情。相反,您可能只想使用 std::setstd::map,而不是在添加之前搜索以查找该项目是否已经存在,只需使用 insert ,如果具有该键的项目已经存在(但如果标题是新的则添加),它将失败。由于我们已经研究过使用 std::map,所以让我们考虑一下使用集合会是什么样子:

class Message {
std::string title;
// other stuff
public:
bool operator<(Message const &other) const { return title < other.title; }
}:

std::set<Message> messages;

messages.insert(some_new_message); // automatically unique

根据情况(如果你有很多消息,不要关心它们被排序)你可能想要使用 std::unordered_set 而不是 std::set (这同样适用于 std::mapstd::unordered_map)。

关于c++ - (C++ Boost) 在列表中查找成员与搜索词匹配的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14844587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com