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

(C++ Boost) Find item in list where member matches search term

本文关键字:搜索 项目 成员 C++Boost 列表 查找      更新时间:2023-10-16

有没有一种很好的方法可以将下面的代码简化为一个带有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::setstd::mapstd::unordered_map也是如此)。

在带有boost的C++中,您应该能够执行以下操作:

bool unique = boost::find_if(messages, boost::bind( &Message::title, _1 ) == title) == messages.end();

在C++11中使用带有boost的Linq,您应该能够编写以下内容:

bool unique = boost::empty(LINQ(from(m, message) where(m.title() == title)));

您不能在C++中使用相同的first_or_default,因为默认值不是空指针。