[英]How to set needle type in std::binary_search
我有以下簡單程序,將對項目進行binary_search:
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
class Record
{
public:
Record() = default;
Record(std::string name, int data) : mName(name), mData(data) { }
std::string mName;
int mData = 0;
};
int main(int, char**)
{
std::vector<Record> recs;
recs.emplace_back(Record("1", 1));
recs.emplace_back(Record("55555", 2));
recs.emplace_back(Record("333", 3));
recs.emplace_back(Record("qwertyuiop", 4));
recs.emplace_back(Record("22", 5));
recs.emplace_back(Record("4444", 6));
std::cout << "Unsorted:" << std::endl;
for (auto& rec : recs)
{
std::cout << "Name: " << rec.mName << " Data: " << rec.mData << std::endl;
}
std::cout << std::endl;
std::stable_sort(recs.begin(), recs.end(), [](const Record& lhs, const Record& rhs) -> bool
{
return lhs.mName.length() < rhs.mName.length();
});
std::cout << "Sorted:" << std::endl;
for (auto& rec : recs)
{
std::cout << "Name: " << rec.mName << " Data: " << rec.mData << std::endl;
}
std::cout << std::endl;
if (std::binary_search(
recs.begin(),
recs.end(),
Record("qwertyuiop", 4),
[](const Record& lhs, const Record& rhs) -> bool
{
return lhs.mName < rhs.mName;
}))
{
std::cout << "Found" << std::endl;
}
else
{
std::cout << "Not found" << std::endl;
}
return 0;
}
如何基於其他T類型搜索“記錄”向量? 例如std :: string而不是Record?
就像是:
if (std::binary_search(
recs.begin(),
recs.end(),
"qwertyuiop",
[](const Record& lhs, const std::string& rhs) -> bool
{
return lhs.mName < rhs.mName;
}))
{
std::cout << "Found" << std::endl;
}
else
{
std::cout << "Not found" << std::endl;
}
我想要的是-基本上我不想構造一個Record來搜索它,因為這對我來說是一個性能問題。
您可以創建一個處理異構比較的函數對象類型:
struct comp_t
{
bool operator()(Record const& lhs, std::string const& rhs) const {
return lhs.mName < rhs;
}
bool operator()(std::string const& lhs, Record const& rhs) const {
return lhs < rhs.mName;
}
};
然后,您可以像這樣調用binary_search
:
std::binary_search(recs.begin(), recs.end(),
std::string("qwertyuiop"),
comp_t{})
您可以通過添加一個implicit
構造函數將std::string
轉換為Record
以及一個運算符將Record
轉換為std::string
。
operator std::string() const {
return mName;
}
Record(std::string name) : mName(name), mData(int()) {}
或者您可以將現有的構造函數轉換為此
Record(std::string name, int data = int()) : mName(name), mData(data) {}
但是無論如何,您都需要創建一個std::string
對象來進行搜索。
/// create std::string object from "qwertyuiop"
if (std::binary_search(recs.begin(), recs.end(), std::string("qwertyuiop"),
[](const Record & lhs, const std::string & rhs) -> bool
{
return lhs.mName < rhs; /// rhs is a std::string type
})) {
std::cout << "Found" << std::endl;
}
else {
std::cout << "Not found" << std::endl;
}
請參閱http://ideone.com/0f16GE演示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.