描述:
使用一个map
当value为自定义类,会出现相关问题,例如:
- #include
- #include
- #include
- #include
- using namespace std;
-
- class A {
-
- public:
- A(){
- cout<<"A()"<<",Line:"<<__LINE__<
- }
- A(int key,int val): key(key),val(val) {
- cout<<"A(int key,int val) = "<<"k="<
"v="<",Line:"<<__LINE__< - }
- A(const A & a) {
- cout<<"A(A & a) =,Line:"<<__LINE__<
- key = a.key;
- val = a.val;
- }
- const A & operator=(const A & a) {
- cout<<"A & operator=,Line:"<<__LINE__<
- key = a.key;
- val = a.val;
- return *this;
- }
- int key;
- int val;
- };
-
- int main() {
- std::map<int,A> vm = {{1,A(1,1)}};
-
- cout<<"Start vm"<
- // 使用[]时,先调用默认构造,再调用赋值函数,如果没有实现默认构造,编译会报错,错误如上<<...>>所示,或者使用insert_or_assign函数.
- vm[2] = A(2,2);
- cout<<"End vm"<
-
- return 0;
- }
- /*
- A(int key,int val) = k=1v=1,Line:14
- A(A & a) =,Line:17
- A(A & a) =,Line:17
- Start vm
- A(int key,int val) = k=2v=2,Line:14
- A(),Line:11
- A & operator=,Line:22
- End vm
- */
map中value是自定义类型的,直接使用[]进行存储结时,例中value的调用自身方法为先调用{默认无参构函数,再调用赋值函数}
所以,如下使用[]存value,必须在student中实现默认构造,不然编译会出错,如下:
<<
没有默认无参构造函数,直接编译报错失败:(添加默认构造函即可解决该问题)
/usr/include/c++/4.8.2/tuple:1090:70: error: no matching function for call to ‘A::A()’
second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
>>
c++17中,解决了该问题,可以直接使用insert_or_assign()
vm.insert_or_assign(0,A(0,0));
2.使用结构体或者类作为map的key是,需要重载运算符<,不然会就报错,
- /usr/include/c++/5/bits/stl_function.h:387:20: error: no match for ‘operator<’ (operand types are ‘const Person’ and ‘const Person’)
- { return __x < __y; }
通常使用string直接坐为key,那是因为string重载了运算符<.
正确使用代码:
- #include
- #include
- #include
- #include
- using namespace std;
-
- class A {
-
- public:
- A(){
- cout<<"A()"<<",Line:"<<__LINE__<
- }
- A(int key,int val): key(key),val(val) {
- cout<<"A(int key,int val) = "<<"k="<
"v="<",Line:"<<__LINE__< - }
- A(const A & a) {
- cout<<"A(A & a) =,Line:"<<__LINE__<
- key = a.key;
- val = a.val;
- }
-
-
- const A & operator=(const A & a) {
- cout<<"A & operator=,Line:"<<__LINE__<
- key = a.key;
- val = a.val;
- return *this;
- }
-
- bool operator< (const A & a) const { // 重载运算符,因为插入map是需要进行当前key值的比较排
- return key < a.key || val < a.val;
- }
- int key;
- int val;
- };
-
-
- void display(std::mapint> mm){
- for(const auto & iter:mm) {
- cout<
"--"<"--"< - }
- }
- int main() {
-
- std::mapint> sm;
- sm[A(4,5)] = 1;
- display(sm);
-
- return 0;
- }
- 输出:
-
- 4--5--1
- 4--6--2
-
相关阅读:
普通人下场全球贸易,新一轮结构性机会浮出水面
车道线检测(二)——使用MNN部署PINet
【代码精读】optee的异常向量表
MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅
Spring Boot集成protobuf快速入门Demo
[SQL开发笔记]SQL 别名:为表名称或列名称指定别名
(十二)群组业务
【PowerQuery】PowerQuery导入JSON数据
Project Office X for Mac项目管理工具
Ubuntu 安装 MySQL 8.23
-
原文地址:https://blog.csdn.net/qq_26105397/article/details/126252100
-
最新文章
-
沪漂五周年了:我越来越迷茫了
Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
MySQL-Seconds_behind_master的精度误差
[MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
Agent OS :五种驯服不确定性的范式
PortSwigger SQL注入LAB11
数据库即时编译JIT
[Begin]AI Learn Data Day 0
深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU