如何声明指向C++11 std::数组的指针
How do you declare a pointer to a C++11 std::array?
根据变量,我需要选择SeedPositions32或SeedPositings16数组以供进一步使用。我以为一个指针会允许这样做,但我无法让它发挥作用。如何声明指向C++11 std::数组的指针?我试过下面的。
array<int>* ArrayPointer;
//array<typedef T, size_t Size>* ArrayPointer;
array<int,32> SeedPositions32 = {0,127,95,32,64,96,31,63,16,112,79,48,15,111,80,
47,41,72,8,119,23,104,55,87,71,39,24,7,56,88,103,120};
array<int,16> SeedPositions16 = {...}
std::array
有一个用于大小的模板参数。具有不同大小的两个std::array
模板实例化是不同的类型。因此,你不可能有一个指针指向不同大小的数组(除了void*
的欺骗,它打开了自己的蠕虫罐头。)
您可以使用客户端代码的模板,也可以使用std::vector<int>
。
例如:
template <std::size_t N>
void do_stuff_with_array(std::array<int, N> the_array)
{
// do stuff with the_array.
}
do_stuff_with_array(SeedPositions32);
do_stuff_with_array(SeedPositions16);
请注意,您还可以获得指向数据的指针:
int* ArrayPtr = SeedPositions32.data();
但是在这里,您已经丢失了大小信息。你必须独立地跟踪它。
您可以简单地使用std::array::data()
成员函数将std::array
的内容作为原始的类C数组指针进行访问:
int* arrayPointer = useSeedPositions32 ? SeedPositions32.data() : SeedPositions16.data();
问题是你为什么要这么做?不可能使用(指向)std::array<int,32>
的指针来代替std::array<int,16>
。
std::array<>
的目的是在编译时跟踪元素的数量(同时避免为固定大小的小数组分配内存)。如果您希望在运行时管理元素的数量,则可能不应该使用std::array<>
,而应该使用std::vector
。
获得指向底层数据的指针(使用其他答案中提出的std::array::data()
)并自己跟踪元素数量的替代方法有点危险,并不推荐。问题是,您必须确保指针永远不会悬空。
最后,我找不到任何可能的用例。为了使用指针,必须同时声明array<int,32>
和array<int,16>
对象,但只能使用其中一个。如果不需要全部32个元素,为什么不简单地只声明一个array<int,32>
并只使用它的前16个元素呢?
您可以这样做:
int * myArray = use32 ? &SeedPositions32[0] : &SeedPositions16[0];
- C++中的VLA,扩展名为std=C++11
- 编译器不会使用 -std=c++11 编译智能指针
- C ++枚举范围无法使用-std=c ++ 98进行编译,但使用-std=c ++ 11可以
- std::使用 -std=gnu++11 开关编译时相等错误
- "unix" C++预处理器宏未定义 -std=c++11
- 用STD = C 11或其他标准编译Boost,例如Ash C 14
- 网站组装 |错误:'C/ObjC'不允许使用无效'-std=c++11'参数
- G++ - 警告:扩展初始值设定项列表仅适用于 -std=C++11 或 -std=GNU++11
- 如何避免每次编译时都必须键入 -std=c++11
- 无法用"-std=c++11"编译《你好世界》
- 无法在Eclipse Neon.3中同时使用-std = C 11和-l/-l选项
- Cython -STD = C 11错误,使用C和C
- 扩展初始化器列表仅可用-STD = C 11或-STD = GNU 11中的C
- 为什么将语言标准从-STD = GNU 98到-STD = GNU 11
- 为什么 std::move 未定义,尽管编译器使用 -std=c++11 调用
- 我可以安全地将编译的库与-STD = C 11和-STD = C 14
- MATLAB MEX:-STD = C 11使用,但MEX错误仍然是错误
- Makefile with -std=c++11
- CUDA 8 编译错误与 -std=gnu++11
- QT 5.7将-STD = GNU 11添加到我的编译器标志,Clobbering -Std = C 14