map里存放结构体、类,什么时候map的大小不改变

当map存放结构体、类时,会报错:
在这里插入图片描述

这是因为map内部有序,有排序机制,所以要定个规则使它有序,所以需要重载operator < 运算符函数
比如(类同理):

struct solution {
	int x, y;
	solution() {}
	solution(int x1, int y1) :x(x1), y(y1) {}
	
	bool operator<(const solution& s) const {
		return x < s.x;
	}
};

但如上的例子是基于x进行比较的,故如果两个结构体的x值是一样的,那么map的size是不会改变的

#include<iostream>
#include<map>

using namespace std;

struct solution {
	int x, y;
	solution() {}
	solution(int x1, int y1) :x(x1), y(y1) {}
	
	bool operator<(const solution& s) const {
		return x < s.x;
	}
};

int main() {
	map<solution, int> m;
	m[solution(1, 2)] = 6;
	m[solution(1, 3)] = 7;
	cout << m[solution(1, 2)] << endl;
	cout << m[solution(1, 3)] << endl;
	cout << m.size() << endl;
}

此段代码输出的是

7
7
1

也就是说,m[solution(1, 3)] = 7时,m[solution(1,2)]被更新为7,map的size不变

如果两个结构体的x值不同,则map的size是会改变的

	map<solution, int> m;
	m[solution(1, 2)] = 6;
	m[solution(4, 2)] = 7;
	cout << m[solution(1, 2)] << endl;
	cout << m[solution(4, 2)] << endl;
	cout << m.size() << endl;

输出的是

6
7
2
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Windows 平台下,可以使用以下步骤存放结构体数据到共享内存中: 1. 定义需要存储的结构体数据型。 2. 创建共享内存对象,可以使用 Windows API 函数 CreateFileMapping()。 3. 映射共享内存到当前进程的地址空间中,可以使用 Windows API 函数 MapViewOfFile()。 4. 在共享内存中存储结构体数据,可以使用 memcpy() 函数将结构体数据复制到共享内存的地址空间中。 5. 当需要访问共享内存中的结构体数据时,可以使用相应的指针型进行访问。 下面是一个简单的示例代码: ```c++ #include <Windows.h> #include <iostream> // 定义需要存储的结构体数据型 struct MyData { int i; double d; char str[20]; }; int main() { // 创建共享内存对象 HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // 使用无效的句柄创建 NULL, // 默认安全特性 PAGE_READWRITE, // 共享内存的读写权限 0, // 大小为0表示文件映射到整个文件 sizeof(MyData), // 共享内存的大小 L"MySharedMemory"); // 共享内存对象的名称 if (hMapFile == NULL) { std::cerr << "CreateFileMapping failed: " << GetLastError() << std::endl; return 1; } // 映射共享内存到当前进程的地址空间中 LPVOID lpMapAddress = MapViewOfFile( hMapFile, // 共享内存的句柄 FILE_MAP_ALL_ACCESS, // 共享内存的访问权限 0, // 偏移量为0表示从文件的开头开始映射 0, // 映射整个文件 sizeof(MyData)); // 映射的大小 if (lpMapAddress == NULL) { std::cerr << "MapViewOfFile failed: " << GetLastError() << std::endl; CloseHandle(hMapFile); return 1; } // 在共享内存中存储结构体数据 MyData data = { 123, 3.14, "Hello shared memory!" }; memcpy(lpMapAddress, &data, sizeof(MyData)); // 访问共享内存中的结构体数据 MyData* pData = reinterpret_cast<MyData*>(lpMapAddress); std::cout << "i = " << pData->i << std::endl; std::cout << "d = " << pData->d << std::endl; std::cout << "str = " << pData->str << std::endl; // 解除映射并关闭共享内存对象 UnmapViewOfFile(lpMapAddress); CloseHandle(hMapFile); return 0; } ``` 需要注意的是,由于共享内存是多个进程共享的,因此在访问共享内存时需要进行同步操作,以避免数据的竞争和冲突。例如,可以使用互斥量或信号量等同步机制来保护共享内存的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值