为了说明我的问题,我复制了以下代码来自"电话簿" Boost帮助文档的例子。
struct phonebook_entry
{
std::string family_name;
std::string given_name;
std::string ssn;
std::string phone_number;
}
我可以进行部分搜索,如下所示
// search for Dorothea White's number
phonebook::iterator it=pb.find(boost::make_tuple("White","Dorothea"));
但是,如果我需要计算姓氏为" White"的人数,那么请继续查看有多少" White"'有多萝西娅"'作为他们的名字,那么最好的方法是什么? 我想我可以用pb.find(boost :: make_tuple(" White"))和pb.find(boost :: make_tuple(" White",&#34)做两个部分查询; Dorothea")。但我担心这是否会导致性能问题?因为第二个查询不知道第一个查询,只搜索整个容器。 Boost是否提供如下内容:
std::pair<iterator,iterator> partialResults=pb.equal_range("White");
std::pair<iterator, iterator> partialOfPartial=pb.equal_range("Dorothea", partialResults);
或者有更聪明的方法吗?不仅从便利的角度来看,而且是为了表现。
答案 0 :(得分:3)
因为phonebook
具有复合键,所以它按姓氏中的给定名称排序。因此,您可以将第一个搜索结果中的常规std::equal_range
调用match a dummy phonebook_entry
,其中只定义了“多萝西”:
int main()
{
phonebook pb; // no initializer_list support for multi_index_container yet
pb.insert({ "White", "Dorothy", "1" });
pb.insert({ "Black", "Dorothy", "2" });
pb.insert({ "White", "John", "3" });
pb.insert({ "Black", "John", "4" });
pb.insert({ "White", "Dorothy", "5" });
auto const w = pb.equal_range("White");
auto const d = phonebook_entry{"", "Dorothy", ""};
auto const wd = std::equal_range(w.first, w.second, d, [](phonebook_entry const& lhs, phonebook_entry const& rhs) {
return lhs.given_name < rhs.given_name;
});
std::for_each(wd.first, wd.second, [](phonebook_entry const& pbe) {
std::cout << pbe.phone_number << "\n";
});
}
Live example将打印“White,Dorothy”电话号码1和5。