struct compare{
string k;
compare(string a) : k(a){}
bool operator()(const product* t)const{
return (t->productdetails.getName()<k);
}
};
void cashier::calculate(string s,vector<product*> &a){
//this is lambda (tried to use it ,but doesn't work)
auto comp=[](const product* t, const string b)
{
return (b < t->productdetail.getName());
};
if (std::binary_search ( a.begin(), a.end(),s, compare(s)))
cout << "found!\n";
else
std::cout << "not found.\n";
}
我在这部分上停留了很长时间。 向量包含product(class)指针。产品指针指向具有两个变量(名称和价格)的productdetail
我需要在向量中查找(字符串s),如果字符串s在向量中(product-> productdetail.getName()),则需要返回价格。
如何比较ridect *和字符串s? 我的老师给我建议,因为比较类型必须相同,所以我需要制作花药字符串转换功能。
(我尝试使用lambda,但它不起作用,并更改为比较功能)
答案 0 :(得分:0)
我同意@Fureeish,除非绝对必要,否则在现代C ++中使用裸指针不是一个好选择。
也就是说,为标准库编写谓词需要对所使用的库方法有充分的了解。看看std::binary_search文档。一个简单的应用程序就是搜索与搜索相同的类型。换句话说,您的针与大海捞针的类型相同。这是一个示例:
#include <iostream>
#include <vector>
#include <algorithm>
class product {
public:
class product_details {
public:
std::string name;
double price;
};
product_details productDetails{};
product(std::string const &name, double price) : productDetails{ name, price} {}
};
struct product_compare {
bool operator()(product const &lhs, product const &rhs) {
return lhs.productDetails.name < rhs.productDetails.name;
}
};
int main(int argc, char *argv[])
{
std::vector<product> producList{
{ "toaster", 74.99 },
{ "blender", 103.99 },
{ "slow cooker", 142.99 }
};
product_compare productCompare{};
std::sort(producList.begin(), producList.end(), productCompare);
product searchProduct{"slow cooker", 142.99};
if (std::binary_search(producList.begin(), producList.end(), searchProduct, productCompare))
std::cout << "Found!\n";
else
std::cout << "Not found!\n";
}
但是那缺乏优雅。您的针头可以是其他类型,答案实际上是in this SO question。这是利用此优势的重写。这个习惯用法写起来有点复杂,但是与实际问题更好地关联,因此更容易理解。最终,您永远不知道比较的哪一边会很困难,哪一边会很麻烦。因此,您必须编写比较谓词才能接受两个比较。
#include <iostream>
#include <vector>
#include <algorithm>
class product {
public:
class product_details {
public:
std::string name;
double price;
};
product_details productDetails{};
product(std::string const &name, double price) : productDetails{ name, price} {}
};
struct product_compare {
bool operator()(std::string const &lhs, product const &rhs) {
return lhs < rhs.productDetails.name;
}
bool operator()(product const &lhs, std::string const &rhs ) {
return lhs.productDetails.name < rhs;
}
};
// Used by std::sort
bool operator<(product const &lhs, product const &rhs) {
return lhs.productDetails.name < rhs.productDetails.name;
}
int main(int argc, char *argv[])
{
std::vector<product> producList{
{ "toaster", 74.99 },
{ "blender", 103.99 },
{ "slow cooker", 142.99 }
};
product_compare productCompare{};
std::sort(producList.begin(), producList.end());
if (std::binary_search(producList.begin(), producList.end(), std::string("slow cooker"), productCompare))
std::cout << "Found!\n";
else
std::cout << "Not found!\n";
}