下面的代码片段无法编译。我尝试了不同的初始化程序,但无法编译。
\n#include <array>\n#include <semaphore>\n\n\nint main()\n{\n std::array<std::binary_semaphore, 4> semaphores { {0}, {0}, {0}, {0} };\n auto& [ lock1, lock2, lock3, lock4 ] { semaphores };\n}\nRun Code Online (Sandbox Code Playgroud)\n这是错误消息:
\n#include <array>\n#include <semaphore>\n\n\nint main()\n{\n std::array<std::binary_semaphore, 4> semaphores { {0}, {0}, {0}, {0} };\n auto& [ lock1, lock2, lock3, lock4 ] { semaphores };\n}\nRun Code Online (Sandbox Code Playgroud)\n难道不能声明一个binary_semaphores 数组吗?正确的语法是什么?
如果我std::array<T, N>用大括号构造 a 并给它少于N项目,那么这些项目是否为零初始化?(或者它们是否保留默认初始化?)如果我给它零个项目(即= {}),那么我相信它会将所有元素零初始化。
我找不到这个简单问题的明确答案。由于std::array在像 一样使用时使用聚合初始化std::array<int, 2> x = { 1 };,因此导致聚合初始化规则的https://en.cppreference.com/w/cpp/language/aggregate_initialization 。在那里,我看到的关于这种情况的唯一提及是“如果指定了数组的大小并且它大于字符串文字中的字符数,则其余字符将被零初始化。” 但这是在“字符数组”部分中,所以看起来通常不是这样。另一方面,用作constexrpUB 检测器表明它们已归零: https: //godbolt.org/z/zE9xKvbrq
有关的:
我需要对 an 进行排序std::array,但我不知道如何使用该函数来执行此std::sort()操作,因为我收到错误“没有重载函数排序的实例与参数列表匹配”和“没有运算符 '+' 与这些操作数匹配”。当我使用相同的语法尝试对常规数组进行排序时,没有出现任何错误。这是产生问题的代码:
#include <algorithm>
#include <array>
int nums[5] = {1, 2, 3, 4, 5};
std::array<int, 5> morenums = {1, 2, 3, 4, 5};
int main(){
std::sort(nums, nums + 5);//no error
std::sort(morenums, morenums + 5);//error
}
Run Code Online (Sandbox Code Playgroud)
我试图使用该std::sort()方法对 an 进行排序std::array,但我不知道如何执行此操作,因为我不断收到错误。
我试图std::array在C++中访问给定其指针的元素.这是一些说明我的问题的代码:
#include <iostream>
#include <array>
void func(std::array<int, 4> *);
int main()
{
std::array<int, 4> arr = {1, 0, 5, 0};
func(&arr);
}
void func(std::array<int, 4> *elements)
{
for (int i = 0; i < 4; i = i + 1)
{
std::cout << *elements[i] << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这可以打印std::array新行的每个元素.但是,它甚至没有过去编译:
main.cpp: In function ‘void func(std::array<int, 4ul>*)’:
main.cpp:16:22: error: no match for ‘operator*’ (operand type is ‘std::array<int, 4ul>’)
std::cout << *elements[i] << std::endl;
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
谢谢!
考虑以下代码:
struct foo {
std::vector<int> v;
foo(std::initializer_list<int> L) : v{L} {}
};
Run Code Online (Sandbox Code Playgroud)
上面的代码编译正常并按v预期初始化.现在考虑以下代码:
struct bar {
std::array<int, 3> a;
bar(std::initializer_list<int> L) : a{L} {}
};
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了编译错误.
错误:没有可行的从'std :: initializer_list'到'int'的转换
在网上搜索我发现std::array使用a 初始化成员的"正确"方法std::list_initializer是以reinterpret_cast下列方式使用:
bar(std::initializer_list<int> L) : a(reinterpret_cast<std::array<int, 3> const&>(*(L.begin()))) {}
Run Code Online (Sandbox Code Playgroud)
为什么我可以在构造函数的初始化列表中初始化一个成员std::vector,std::initializer_list但我不能成为成员std::array?
是工作,各地表现出上面reinterpret_cast初始化成员的正确方法std::array有std::initializer_list?
我已经阅读了很多关于在C++中不使用C风格的东西,而是使用像std :: array,std :: vector或std :: string这样的容器.
现在我试图用文件流读取和写入小二进制文件并将其存储在std :: array中.
看起来std :: fstream的read和write方法只适用于C风格的数组......
所以这就是我的想法:
int main(int argc, char **argv)
{
std::fstream testFile, outTestFile;
testFile.open("D:/mc_svr/another/t/world/region/r.0.0.mca", std::fstream::in | std::fstream::binary);
outTestFile.open("D:/mc_svr/another/t/world/region/xyz.xyz", std::fstream::out | std::fstream::binary);
std::array<byte_t, 8192> testArray;
testFile.read((char*) &testArray, 8192);
outTestFile.write((char*) &testArray, 8192);
testFile.close();
outTestFile.close();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
byte_t只是一个
typedef char byte_t;
Run Code Online (Sandbox Code Playgroud)
有用.但这是做这件事的好方法吗?如果不是,还有其他方法吗?我应该使用byte_t []吗?
我有一个没有MMU的微控制器,但我们使用的是C和C++.
我们避免使用所有动态内存(即没有new SomeClass()或malloc())和大多数标准库.
半问题0:
据我所知std::array,不使用任何动态内存,所以它的用法应该没问题(它只在堆栈上).查看std::array源代码,它看起来很好,因为它创建了一个c风格的数组,然后围绕该数组包装功能.
我们使用的芯片有1MB的闪存用于存储代码.
问题1:
我担心使用模板std::array会导致二进制文件变大,这可能会导致二进制文件超过1MB的代码内存限制.
我想如果你创建一个a的实例std::array< int, 5 >,那么所有对函数的调用std::array都将占用一定数量的代码内存,让我们说X字节的内存.
如果你创建了另一个实例std::array< SomeObject, 5 >,然后调用函数,那么std::array现在每个函数都会在二进制文件中重复,从而占用更多的代码内存吗?X字节的内存+ Y字节的内存.
如果是这样,您认为在有限的代码内存容量下生成的代码量是一个问题吗?
问题2:
在上面的示例中,如果您创建了第二个std::array< int, 10 >实例,对函数的调用是否也会复制生成的代码中的函数调用?尽管这两种情况都是同一类型的,int?
我试图初始化一个结构数组std::array.我知道以下是一种初始化std::array整数的方法.
std::array<int, 5> arr { {1, 2, 3, 4, 5} };
Run Code Online (Sandbox Code Playgroud)
场景:
但是,假设我有一系列这样的结构
struct MyStruct {
const char *char_val_1;
const char *char_val_2;
int int_val_1;
double d_val_1;
} my_struct_obj[] = {
{ "a1b1" , "a2b1" , 1 , 1.1 },
{ "a1b2" , "a3b1" , 2 , 1.2 },
{ "a1b3" , "a4b1" , 3 , 1.3 },
{ "a1b4" , "a5b1" , 4 , 1.4 },
{ "a1b5" , "a6b1" , 5 , 1.5 },
{ …Run Code Online (Sandbox Code Playgroud) 我的程序中需要一些大数组,并且正在使用size = 16 * 16 * 12 * 12的数组对其进行测试。
然后,我改变了我的程序与运行的大小= 64 * 64 * 12 * 12,并在崩溃前甚至去主。
这样的阵列会占用太多内存吗?我试图在笔记本电脑上然后在一些功能更强大的台式机上运行代码,在这两种情况下,它都随着较大的阵列立即崩溃,并且适用于较小的阵列。数组大小由在代码开头声明的const int控制。我用
std::array<double, (64*64*12*12)>.
Run Code Online (Sandbox Code Playgroud)
提前致谢
更新:我编写的具有相同问题的最小程序如下:
#include <iostream>
#include <array>
using namespace std;
//declare variables
using std::array;
const int size_q=2;
const int qpoints=size_q*size_q*size_q;
const int size_k=2;
const int kpoints=size_k*size_k*size_k;
const int branches=12;
const int size_ph=kpoints*branches;
const int size_Theta=size_ph*size_ph;
array<double, size_Theta> f_ph(array<double,size_Theta>);
int main(int argc, char const *argv[])
{
array<double, size_Theta> theta1;
f_ph(theta1);
cout <<"Done";
return 0; …Run Code Online (Sandbox Code Playgroud) 例如,我有类似的代码:
template<typename A, typename B>
using Map = std::map<A, B>;
template<typename A, typename B>
using UnorderedMap = std::unordered_map<A, B>;
Run Code Online (Sandbox Code Playgroud)
我想对做同样的事情std::array,即:
template<typename A, typename B>
using Array = std::array<A, B>;
Run Code Online (Sandbox Code Playgroud)
但是,如果这样做,我将得到一个编译器错误:
错误C2993:'B':非类型模板参数'_Size'的非法类型
错误C2955:“ std :: array”:使用类模板需要模板
参数列表array(21):message:参见'std :: array'的声明
有什么方法可以声明Array在后台使用的std::array吗?
最后,我想使用Array<int, 7> items代替的数组std::array<int, 7> items。