(C+;+;Boost)在成员与搜索词匹配的列表中查找项 P>有一个很好的方法,将下面的代码简化为一个带有C++的内层,并有可能是Boost库。我基本上有一个以title()作为成员函数的消息列表。我想知道列表中是否存在具有给定标题的邮件 std::string title=“some title”; bool unique=true; BOOST_FOREACH(消息与维护、消息){ 如果(m.title()==标题){ 唯一=错误; 打破 } } 如果您熟悉C语言LINQ,下面的C++版本将是非常好的: unique=(messages.FirstOrDefault(m=>m.title()==title)==null);

(C+;+;Boost)在成员与搜索词匹配的列表中查找项 P>有一个很好的方法,将下面的代码简化为一个带有C++的内层,并有可能是Boost库。我基本上有一个以title()作为成员函数的消息列表。我想知道列表中是否存在具有给定标题的邮件 std::string title=“some title”; bool unique=true; BOOST_FOREACH(消息与维护、消息){ 如果(m.title()==标题){ 唯一=错误; 打破 } } 如果您熟悉C语言LINQ,下面的C++版本将是非常好的: unique=(messages.FirstOrDefault(m=>m.title()==title)==null);,c++,boost,find,C++,Boost,Find,不幸的是,我不能使用C++11,但如果你有一个C++11的例子,我会有兴趣看到它作为未来的参考 提前感谢。至少从外观上看,您可能希望使用std::map来存储按标题键入的消息: std::map<std::string, Message> messages; 如果您坚持进行线性搜索,并希望保持当前的状况,即title是Message的成员,您可以执行以下操作: bool unique = messages.find(title) == messages.end(); bool u

不幸的是,我不能使用C++11,但如果你有一个C++11的例子,我会有兴趣看到它作为未来的参考


提前感谢。

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

std::map<std::string, Message> messages;
如果您坚持进行线性搜索,并希望保持当前的状况,即
title
Message
的成员,您可以执行以下操作:

bool unique = messages.find(title) == messages.end();
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< /Cord>,让我们考虑一下集合的样子:

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::字符串标题;
//其他东西
公众:

BOOL运算符

C++中的Boost,你应该能做这样的事情:< /P>

bool unique = boost::find_if(messages, boost::bind( &Message::title, _1 ) == title) == messages.end();
在C++11和boost中使用时,您应该能够编写以下代码:

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

不能使用相同的<代码> FiSTyOR.ORDER 在C++中,因为默认值不是空指针。

这是非常好的。谢谢。从来没有考虑使用集合。我会看看这是否适合我的代码。我对使用MAP的关注是我可能有几百个这些消息集合,每个集合都很小。使用列表来保存由于大量集合而导致的内存。@ rpAMLY听起来是一个很好的权衡考虑。然而,有利于STD::在STD上的向量::列出完全相同的原因(地点)。对于小型集合,线性搜索的性能优于二进制搜索,当然对于基于树的表示法也是如此。@r默认情况下:除了存储的数据外,列表节点还有指向下一个和上一个项目的指针,其中树节点有指向左、右子树的指针,以及一位平衡信息。通常至少接近相同的size.谢谢你们两位的帮助。我认为在本例中,最好的解决方案是将其更改为地图。但是,其他关于如何线性搜索的示例无疑在其他场景中会有所帮助。不过,我很感兴趣,对于std::find示例,有人知道如何使用boost lambdas执行此操作吗?我已经阅读了文档,我不是真正的ge至少如果你总是按标题搜索,而不是按boost lambda搜索,我会定义一个大致与
操作符类似的
操作符==
。我真的很喜欢这个boost解决方案。