(C++Boost)在列表中查找成员与搜索词匹配的项目
(C++ Boost) Find item in list where member matches search term
有没有一种很好的方法可以将下面的代码简化为一个带有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();
如果你坚持做线性搜索,并想在title
是Message
成员的情况下保持你的现状,你可以做这样的事情:
bool unique = std::find(messages.begin(), messages.end(),
[title](Message const &m) { return m.title == title; })
== messages.end();
但是,您可能不想执行上述任何操作。相反,您可能只想使用std::set
或std::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::map
和std::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
,因为默认值不是空指针。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- 如何从 std::vector 搜索和返回项目
- 在给定的项目列表上实现搜索?
- 根据条件和优先级搜索容器中的项目
- 我想使用列表中的项目在地图中搜索
- STD :: MAP-如何查找或添加,然后可以在一次搜索中删除项目
- 二进制搜索树电影数据库项目
- 搜索匹配两个容器中的项目C++
- 在C++中搜索并删除矢量中的特定项目
- XCode3 - 库搜索路径和项目框架之间的关系
- 搜索函数返回相同的,而不考虑二叉搜索树中存在的项目
- 在矢量中搜索项目
- 在QStringList中搜索特定项目,然后搜索可能包含项目的其他项目
- 在c++中使用STL搜索变量/项目/属性
- 基于排序和搜索算法的c++项目
- 在sqlite3数据库中搜索查询某些项目
- (C++Boost)在列表中查找成员与搜索词匹配的项目
- 使用不在根项目目录上的源文件(包括在搜索路径中的文件)时发生链接错误(Visual C++)