如何比较指针和字符串的向量?

时间:2018-11-17 20:31:55

标签: c++

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,但它不起作用,并更改为比较功能)

1 个答案:

答案 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";
}