# map存储自定义类型数据

28 篇文章 0 订阅

### 问题引出：

struct Test
{
public:
Test(int a, int p, string s) :m_a(a), m_p(p), m_s(s)
{}
int m_a;
int m_p;
string m_s;
};
void main() {
Test t1(1, 4,"苹果");
Test t2(1, 10,"草莓");
Test t3(1, 30,"樱桃");

map<Test,int> s;
s.insert(pair<Test, int>(t1, 1));
s.insert(pair<Test, int>(t2, 2));
s.insert(pair<Test, int>(t3, 3));
for (auto& e : s) {
cout << e.first.m_a<< " : " << e.first.m_p << " : " << e.first.m_s << endl;
}

}


### 方法一：

template < class Key,                                     // map::key_type
class T,                                       // map::mapped_type
class Compare = less<Key>,                     // map::key_compare
class Alloc = allocator<pair<const Key,T> >    // map::allocator_type
> class map;


struct Test
{
public:
Test(int a, int p, string s) :m_a(a), m_p(p), m_s(s)
{}
int m_a;
int m_p;
string m_s;
};
class myCompare
{
public:
bool operator()(const Test& t1, const Test& t2) const
{
return t1.m_p > t2.m_p;  //这里用m_p进行大小比较
}
};
void main() {
Test t1(1, 4,"苹果");
Test t2(1, 10,"草莓");
Test t3(1, 30,"樱桃");

map<Test,int, myCompare> s;
s.insert(pair<Test, int>(t1, 1));
s.insert(pair<Test, int>(t2, 2));
s.insert(pair<Test, int>(t3, 3));
for (auto& e : s)
cout << e.first.m_a<< " : " << e.first.m_p << " : " << e.first.m_s << endl;
}



### 方法二：

eg:

struct Test
{
public:
Test(int a, int p, string s) :m_a(a), m_p(p), m_s(s)
{}

eg:根据m_p大小进行排序
//bool operator < (const Test& t) const
//{
//	return m_p < t.m_p;
//}
//eg:根据m_s的字母顺序进行排序
bool operator < (const Test& t) const
{
return (strcmp(m_s.c_str(), t.m_s.c_str())) < 0;
}

bool operator > (const Test& t) const
{
return m_p > t.m_p;
}

int m_a;
int m_p;
string m_s;
};

class myCompare
{
public:
bool operator()(const Test& t1, const Test& t2) const
{
return t1.m_p > t2.m_p;
}
};

void main() {
Test t1(1, 4,"苹果");
Test t2(1, 10,"草莓");
Test t3(1, 30,"樱桃");

map<Test,int> s;
//map<Test, int,greater<>> s;
s.insert(pair<Test, int>(t1, 1));
s.insert(pair<Test, int>(t2, 2));
s.insert(pair<Test, int>(t3, 3));
for (auto& e : s)
cout << e.first.m_a<< " : " << e.first.m_p << " : " << e.first.m_s << endl;

}



• 4
点赞
• 5
收藏
觉得还不错? 一键收藏
• 1
评论
11-14 2781
12-29 1930
10-31 405
02-14 7740
07-02 1853
03-22 1833

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。