[英]trying to insert std::pair into std::set
i can't understand what the error is in this code: 我无法理解此代码中的错误:
#include <set>
#include <utility>
#include <iostream>
using namespace std;
class A
{
public:
A(unsigned int a) : _a(a) { }
A() : _a(0) { }
unsigned int a() const { return _a; }
private:
unsigned int _a;
};
class B
{
public:
B(unsigned int b) : _b(b) { }
B() : _b(0) { }
unsigned int b() const { return _b; }
private:
unsigned int _b;
};
void display(const Point& point)
{
//cout << "A: " << point.first.a() << ", B: " << point.second.b() << endl;
}
typedef pair <A, B> Point;
typedef set <Point> List;
main()
{
A a(5);
B b(9);
List list;
List::iterator it;
Point point;
point = make_pair(a, b);
it = list.begin();
list.insert(point); // <--- error here
//display(point);
}
error is this: 错误是这样的:
In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_algobase.h:66,
from /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_tree.h:62,
from /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/set:60,
from test.cpp:1:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_pair.h: In function ‘bool std::operator<(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&) [with _T1 = A, _T2 = B]’:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_function.h:230: instantiated from ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = std::pair<A, B>]’
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_tree.h:1170: instantiated from ‘std::pair<typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = std::pair<A, B>, _Val = std::pair<A, B>, _KeyOfValue = std::_Identity<std::pair<A, B> >, _Compare = std::less<std::pair<A, B> >, _Alloc = std::allocator<std::pair<A, B> >]’
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_set.h:411: instantiated from ‘std::pair<typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator, bool> std::set<_Key, _Compare, _Alloc>::insert(const _Key&) [with _Key = std::pair<A, B>, _Compare = std::less<std::pair<A, B> >, _Alloc = std::allocator<std::pair<A, B> >]’
test.cpp:48: instantiated from here
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_pair.h:154: error: no match for ‘operator<’ in ‘__x->std::pair<A, B>::second < __y->std::pair<A, B>::second’
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_pair.h:154: error: no match for ‘operator<’ in ‘__y->std::pair<A, B>::first < __x->std::pair<A, B>::first’
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_pair.h:154: error: no match for ‘operator<’ in ‘__x->std::pair<A, B>::first < __y->std::pair<A, B>::first’
You are trying to use std::set
with an element type that does not have ordering ( , while a set needs that its elements have "a specific strict weak ordering criterion". std::pair
)您正在尝试使用
std::set
,其元素类型没有排序( ,而set需要其元素具有“特定的严格弱排序标准”。 std::pair
)
Update : actually std::pair
does provide an operator<
(thanks @UncleBens ), that is defined in terms of the operator<
of its components; 更新 :实际上
std::pair
确实提供了一个operator<
(感谢@UncleBens ),它是根据operator<
其组件定义的; so the problem lies in your A
and B
not providing a comparison operator; 所以问题出在你的
A
和B
没有提供比较运算符; you should write an operator<
for A
and B
. 你应该写一个
operator<
为A
和B
In alternative, since an operator<
in general doesn't really make sense for points, you can create a comparison functor for your Point
s and pass it as the second template argument for std::set
. 另外,由于
operator<
通常对点没有意义,因此可以为Point
创建比较函子并将其作为std::set
的第二个模板参数传递。
pair
and set
are templates, not classes. pair
和set
是模板,而不是类。 You need to do eg: 你需要这样做:
typedef pair<A, B> Point;
typedef set<Point> List;
A template becomes a class when you instantiate it, eg std::set<int> theset;
模板在实例化时成为一个类,例如
std::set<int> theset;
creates the class set<int>
from the class template set
. 从类模板
set
创建类 set<int>
。
EDIT: As phooj pointed out, you need both A and B to have a comparison operator, operator<
. 编辑:正如phooj指出的那样,你需要A和B都有一个比较运算符,
operator<
。 See Matteo Italia's answer. 见Matteo Italia的答案。
#include <set>
int main(){
typedef pair<int, int> pairs; //creating pair as default data type
pairs p[5]; //array of pair objects
for (int i =0; i<5; i++){
p[i].first= (i+1)*10; //inserting first element of pair
p[i].second = (i+1); //inserting first element of pair
}
set<pairs> s; //set to sort pair
set<pairs> :: iterator it; //iterator to manipulate set
for (int i =0; i<5; i++){
s.insert(p[i]); //inserting pair object in set
}
for (it = s.begin(); it!=s.end(); it++){
pairs m = *it; // returns pair to m
cout<<m.first<<" "<<m.second<<endl; //showing pair elements
}
return 0;
}
You did not specify what's the type of the elements of the set
and pair
are going to be. 您没有指定
set
和pair
的元素类型是什么。
Changing the lines 改变线条
typedef pair Point
to typedef pair<A, B> Point
and typedef set List
to typedef set<Point> List
should fix your problem. typedef pair Point
typedef pair<A, B> Point
和typedef set List
to typedef set<Point> List
应解决你的问题。
One pedantic comment: Naming a set
as List
kind of misleads when you read the code. 一个迂腐的评论:当你阅读代码时,将一个
set
命名为List
类型的误导。
对于任何用户类型,它存储在关联容器(如set / map)中,类型定义必须对其进行“<”操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.