C++ 在集合中查找结构的向量

C++ 在集合中查找结构的向量,c++,C++,我试图找到集合中结构的向量。为此,我编写了以下代码: #include <cstdlib> #include <iostream> #include <set> #include <vector> using namespace std; struct A{ int a; }; int main(int argc, char** argv) { std::set< std::vector<A> > a

我试图找到集合中结构的向量。为此,我编写了以下代码:

#include <cstdlib>
#include <iostream>
#include <set>
#include <vector>

using namespace std;

struct A{
    int a;
};

int main(int argc, char** argv) {

    std::set< std::vector<A> > aObj;
    A a1,a2,a3,a4,a5,a6;
    a1.a=5; a2.a=8; a3.a=10;
    a4.a=5; a5.a=8; a6.a=10;
    vector<A> vecA,vecB;
    vecA.push_back(a1); vecA.push_back(a2); vecA.push_back(a3);
    aObj.insert(vecA);
    set< vector<A> >::iterator it = aObj.find(vecB);
    if (it != myset.end()) {
        cout<<"\n Found vector B. \n";
    }    
    return 0;
}
但是,上面的代码给了我以下错误:

/usr/include/c++/4.6/bits/stl_algobase.h:881:6: error: no match for ‘operator<’ in ‘* __first1 < * __first2’
/usr/include/c++/4.6/bits/stl_algobase.h:881:6: note: candidates are:
/usr/include/c++/4.6/bits/stl_pair.h:207:5: note: template<class _T1, class _T2> bool std::operator<(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&)
/usr/include/c++/4.6/bits/stl_iterator.h:291:5: note: template<class _Iterator> bool std::operator<(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&)
/usr/include/c++/4.6/bits/stl_iterator.h:341:5: note: template<class _IteratorL, class _IteratorR> bool std::operator<(const std::reverse_iterator<_IteratorL>&, const std::reverse_iterator<_IteratorR>&)
/usr/include/c++/4.6/bits/basic_string.h:2510:5: note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::basic_string<_CharT, _Traits, _Alloc>&, const std::basic_string<_CharT, _Traits, _Alloc>&)
/usr/include/c++/4.6/bits/basic_string.h:2522:5: note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*)
/usr/include/c++/4.6/bits/basic_string.h:2534:5: note: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const _CharT*, const std::basic_string<_CharT, _Traits, _Alloc>&)

现在,std::set::find正试图使用std::less将给定向量与集合中的向量进行比较,std::less是std::set实例的默认比较器。AFAIK,std::less将调用bool操作符,就像现在一样,std::set::find正在尝试使用std::less将给定向量与集合中的向量进行比较,std::less是std::set实例的默认比较器。AFAIK,std::less将调用bool操作符另一个答案很好地解释了这一点。如果你能找到向量

以下是如何使代码更加简洁:


这使用聚合初始化A和向量的统一初始化和集合容器{A,b,c}将使用std::Initializer_list构造函数重载

另一个答案很好地解释了这一点。如果你能找到向量

以下是如何使代码更加简洁:


这对A使用聚合初始化,并对向量和集合容器进行统一初始化{A,b,c}将使用std::Initializer_list构造函数重载。很抱歉造成混淆,感谢您的评论。那么,现在集合查找运算符将为向量的所有子集或超集返回true。或者,当只找到实际和精确的向量并返回其位置时,find操作符是否返回true。另外,<运算符如何帮助集合的查找方法也非常感谢您的解释。但如果您能解释一下set的find方法在比较对象时是如何工作的,我将不胜感激set实际上是一个有序集,通常使用平衡二叉树实现。我认为解释搜索二叉树的工作原理有点超出了本文的范围,您应该在其他地方查找。但在不深入细节的情况下,搜索会将集合中的一些元素与第二个集合中的查询元素进行比较。作为一种比较方法,默认情况下它使用std::less,其行为与我前面描述的一样。很抱歉造成混淆,感谢您的评论。那么,现在集合查找运算符将为向量的所有子集或超集返回true。或者,当只找到实际和精确的向量并返回其位置时,find操作符是否返回true。另外,<运算符如何帮助集合的查找方法也非常感谢您的解释。但如果您能解释一下set的find方法在比较对象时是如何工作的,我将不胜感激set实际上是一个有序集,通常使用平衡二叉树实现。我认为解释搜索二叉树的工作原理有点超出了本文的范围,您应该在其他地方查找。但在不深入细节的情况下,搜索会将集合中的一些元素与第二个集合中的查询元素进行比较。作为一种比较方法,默认情况下它使用std::less,其行为与我前面描述的一样。
bool operator<(const A& rhs) const { return a < rhs.a; }
struct VecCmp {
    bool operator<(const std::vector<A>& lhs, const std::vector<A>& rhs) const {
        // determine whether lhs is less than rhs and return true if so, false otherwise
    }
};
std::set<std::vector<A>, VecCmp> myset(VecCmp());
#include <iostream>
#include <set>
#include <vector>

struct A {
    int a;
    bool operator<(A const &other) const { return a < other.a; }
};

int main() {
    std::set<std::vector<A> > myset{ 
        { { 4 }, { 7 }, { 9 } },
        { { 5 }, { 8 }, { 10 } },
        { { 6 }, { 9 }, { 11 } },
    };

    auto it = myset.find({ {1}, {2}, {3} });
    std::cout << "Found vector: " << std::boolalpha << (it != myset.end()) << "\n"; 

    it = myset.find({ {5}, {8}, {10} });
    std::cout << "Found vector: " << std::boolalpha << (it != myset.end()) << "\n"; 
}
Found vector: false
Found vector: true