c++ - 为什么 memcpy() 是一种向 `std::map` 添加元素的方法?

标签 c++ arrays dictionary std stdmap

我一直在尝试创建一个用于线程之间共享访问的容器。我认为我正在寻找的东西看起来像这样:

 std::map<int, std::array<char, 256>>msg_buffers; //make atomic

(原子)array<char,256>的 map 线程将用来中继信息。但问题是,我发现我可以将值复制到映射引用的数组中,它们看起来就像我正常添加元素一样。不过,我有一种感觉,这会导致以后出现问题,而且我很好奇为什么它不会导致错误,或者为什么它能起作用。

这就是它的样子:

#include <array>
#include <map>

std::map<int, std::array<char, 256>>charmap; //a msg queue

char charbuf[256]; //incoming msg buffer
for (int x = 0; x < 256; x++)charbuf[x] = '0'; //make arbitrary msg

//memcopy arbitrary msg **directly** to array at (non existing) map[4]
memcpy(charmap[4].data(), charbuf, sizeof(char) * 256);

//which will then magically exist
std::cout << "Used slots in charmap are: ";
if (!charmap.empty()) 
    for (auto x : charmap)std::cout << x.first << " | "; //cout existing elements

并添加了 memcpy() 的元素即使我没有专门创建该元素,也会正常显示。这是编译器在我不知情的情况下所做的事情吗?我看不出这是一种向 map 添加元素的方式,我觉得它应该发出某种警告。

我使用 Visual Studio 2017 来编译它。

最佳答案

charmap[4]返回对键 4 的值的引用(如果该元素尚不存在,它会自动创建该元素)。该值的类型为 std::array<char, 256> ,可以正常操作。 memcpy 只是将内容复制到该缓冲区中,这里的 memcpy 没有什么魔力。特别是,它不会创建新元素。

关于c++ - 为什么 memcpy() 是一种向 `std::map` 添加元素的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45863832/

相关文章:

python - 使用 Python 查找文件大小的字符串中数组字符串的频率

typescript - 不能在 Typescript Map 中使用数字作为键?

c++ - 包括同一类的不同版本

c++ - 遍历二维 vector 行

php - 如何使用数组中的多个关键字搜索 mysql 表中的列?

java,从多个数组中获取最高值

python - 在没有 NoneType 错误的情况下访问嵌套字典的 pythonic 方法是什么

python字典连接成对差异在一定距离内的连续键的值

c++ - ' t ' 在复制构造函数中表示什么?

C++ 套接字不接收传入数据包,在 Python 中工作