C++ 用于比较指针向量的容器和类型的模板函数

C++ 用于比较指针向量的容器和类型的模板函数,c++,templates,C++,Templates,我想比较指针的两个容器(向量或集合)。我试图拥有一个独立于类型的函数 首先,我尝试了以下方法。但问题是它总是返回0,即使两个容器都有相同内容的对象 template<typename Container > bool isEqual(const Container &lhs,const Container &rhs ) { bool ok = equal(begin(lhs), end(lhs), begin(rhs));

我想比较指针的两个容器(向量或集合)。我试图拥有一个独立于类型的函数

首先,我尝试了以下方法。但问题是它总是返回0,即使两个容器都有相同内容的对象

  template<typename Container >
    bool isEqual(const Container &lhs,const Container &rhs ) {
        bool ok = equal(begin(lhs), end(lhs), begin(rhs));

        return ok;
    }
模板
bool isEqual(集装箱和左舷、集装箱和右舷){
bool ok=相等(开始(左侧)、结束(左侧)、开始(右侧));
返回ok;
}
然后我尝试使用以下功能:

 template<typename T , typename Container >
    bool isEqual(const Container &lhs,const Container &rhs ) {
        bool ok = equal(begin(lhs), end(lhs), begin(rhs),
                    [](const T* lhs, const T* rhs){ return *lhs == * rhs; });

        return ok;
    }
模板
bool isEqual(集装箱和左舷、集装箱和右舷){
bool ok=相等(开始(左侧)、结束(左侧)、开始(右侧),
[](常量T*lhs,常量T*rhs){return*lhs===rhs;});
返回ok;
}
但问题是它产生了以下错误,我不明白为什么

 In function 'int main()':
31:31: error: no matching function for call to 'isEqual(std::vector<Point*>&, std::vector<Point*>&)'
31:31: note: candidate is:
19:6: note: template<class T, class Container> bool isEqual(const Container&, const Container&)
19:6: note:   template argument deduction/substitution failed:
31:31: note:   couldn't deduce template parameter 'T'
36:31: error: no matching function for call to 'isEqual(std::set<Point*>&, std::set<Point*>&)'
36:31: note: candidate is:
19:6: note: template<class T, class Container> bool isEqual(const Container&, const Container&)
19:6: note:   template argument deduction/substitution failed:
36:31: note:   couldn't deduce template parameter 'T'
函数“int main()”中的
:
31:31:错误:调用“isEqual(std::vector&,std::vector&)”时没有匹配的函数
31:31:注:候选人为:
19:6:注意:模板bool isEqual(const-Container&,const-Container&)
19:6:注意:模板参数扣除/替换失败:
31:31:注意:无法推断模板参数“t”
36:31:错误:调用“isEqual(std::set&,std::set&)”时没有匹配的函数
36:31:注:候选人为:
19:6:注意:模板bool isEqual(const-Container&,const-Container&)
19:6:注意:模板参数扣除/替换失败:
36:31:注意:无法推断模板参数“t”

#包括
#包括
#包括
#包括
使用名称空间std;
类点{
公众:
点(intx,inty):x(x),y(y){
私人:
int_x;
国际;
};
模板
bool isEqual(集装箱和左舷、集装箱和右舷){
bool ok=相等(开始(左侧)、结束(左侧)、开始(右侧),
[](常量T*lhs,常量T*rhs){return*lhs===rhs;});
返回ok;
}
int main()
{
向量v1={新点(10,10)};
向量v2={新点(10,10)};
std::cout

template<typename T , typename Container >
bool isEqual(const Container &lhs,const Container &rhs ) {
    bool ok = equal(begin(lhs), end(lhs), begin(rhs),
                [](const T* lhs, const T* rhs){ return *lhs == * rhs; });

    return ok;
}
这将带您进入下一期。
*lhs==*rhs
使用
操作符==
比较对象。您尚未为
点定义
操作符==
,因此它无法编译。您需要将
更改为

class Point {
    public:
    Point(int x, int y):_x(x),_y(y) {}
    bool operator ==(const Point& rhs) { return std::tie(_x, _y) == std::tie(rhs._x, rhs._y); }
    private:
     int _x;
     int _y;
};
所以它们实际上是可以比较的


请注意,如果您使用
std::vector
而不是
std::vector
,则
std::vector
提供它自己的
运算符==
,只需执行以下操作即可比较两个
std::vector

std::vector<Point> v1;
// fill v1
std::vector<Point> v2
// fill v2
if (v1 == v2)
    // vectors are equal.
std::vector v1;
//填充v1
std::vector v2
//填充v2
如果(v1==v2)
//向量是相等的。
看起来没有任何理由让您使用
std::vector
,因此我建议使用此解决方案。

因为您询问“我想比较两个容器(向量或集合)的指针。” 我建议您使用以下形式的
std::equal
进行元素到元素的比较,因为您提到的形式只比较到第一个容器的长度

template<typename Container >
bool isEqual(const Container &lhs,const Container &rhs ) {
bool ok = equal(begin(lhs), end(lhs), begin(rhs), end(rhs),
    [](const auto* lhs, const auto* rhs){ return *lhs == * rhs; });

return ok;
}
模板
bool isEqual(集装箱和左舷、集装箱和右舷){
bool ok=相等(开始(左侧)、结束(左侧)、开始(右侧)、结束(右侧),
[](常量自动*lhs,常量自动*rhs){return*lhs===*rhs;});
返回ok;
}

也就是说,您无论如何都必须为最后执行的比较定义=运算符。正如上面的回答所提到的。

您可能应该提到,lambda中的
自动
参数是一个C++14特性,
std::tie
要求在C++11中包含
我可以使用以下内容:
template bool isContainerEqual(const-Container&lhs,const-Container&rhs){auto-pred=[](decltype(*lhs.begin())a,decltype(a)b){return*a==*b;};return std::equal(lhs.begin(),lhs.end(),rhs.begin(),pred);}
decltype的用法很有趣。我学到了一些新东西。谢谢
std::vector<Point> v1;
// fill v1
std::vector<Point> v2
// fill v2
if (v1 == v2)
    // vectors are equal.
template<typename Container >
bool isEqual(const Container &lhs,const Container &rhs ) {
bool ok = equal(begin(lhs), end(lhs), begin(rhs), end(rhs),
    [](const auto* lhs, const auto* rhs){ return *lhs == * rhs; });

return ok;
}