将 uint16_t * 数组转换为 std::vector

sea*_*ack 3 c++ arrays vector

由于整数大小问题,我无法将 uint16_t 的指针数组转换为 std::vector<uint16_t> 。

        auto *arr = static_cast<const uint16_t *>(some_method.getArray());
        std::vector<uint16_t> vec(arr, sizeof arr / sizeof arr[0]);
Run Code Online (Sandbox Code Playgroud)

在第一行中,我获得了一个const uint16_t*数组。在第二行中,我使用迭代器构造函数初始化向量并传入指针数组arr和数组长度(数组大小除以第一个元素的大小=数组长度)。

但是,c++ 想让我将 arr 转换为unsigned long. 所以这里是演员表

        std::vector<uint16_t> vec((unsigned long) arr, sizeof arr / sizeof arr[0]);
Run Code Online (Sandbox Code Playgroud)

在我看来,从 uint16_t(2 字节)-> unsigned long(4 字节)-> uint16_t(2 字节)进行转换会发生一些不好的事情。有没有更好的方法来进行这种数组转换?

编辑:感谢大家的宝贵反馈,我遇到的主要问题:

  1. sizeof 获取指针的大小,而不是数组的长度。

  2. 我使用了错误的构造函数

arm*_*scu 5

uint16_t* arr; 不是数组,而是指向内存中数组的指针。这个指针的 sizeof 是一个包含地址的整数,总是等于 4。或者其他取决于架构的东西。但始终是相同的常量,而不是数组的大小。

cout<< sizeof(arr)<< endl; // the output is 4
Run Code Online (Sandbox Code Playgroud)

而且 sizeof(arr[0]) 是一个 16 位整数的大小,所以总是 2。然后 sizeof arr / sizeof arr[0] 将始终为 2。
可能您的方法 some_method.getArray() 返回某个大小的数组,您应该将该大小包含在某个num_of_elements变量中。所以使用那个num_of_elements

std::vector<uint16_t> vec(arr, arr + num_of_elements);
Run Code Online (Sandbox Code Playgroud)

  • 不错,但在我的机器上,指针是八个字节。 (4认同)