如何设置std::binary_search中的指针类型
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;
}
是我想要的-基本上我不想构造一个记录来搜索它,因为这对我来说是一个性能问题。
您可以创建一个处理异构比较的函数对象类型:
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;
}
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- std::unordered_map:渐近{search,insert,remove}性能取决于密钥的大小和数据类型
- std::search()的返回类型