标签: stdarray

错误:“std::array<std::counting_semaphore<1>, 4>”的初始值设定项太多

下面的代码片段无法编译。我尝试了不同的初始化程序,但无法编译。

\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}\n
Run 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}\n
Run Code Online (Sandbox Code Playgroud)\n

难道不能声明一个binary_semaphores 数组吗?正确的语法是什么?

\n

c++ initializer-list stdarray binary-semaphore c++20

2
推荐指数
1
解决办法
115
查看次数

使用大括号构造一个“std::array”,其中包含的元素少于它所能容纳的元素?

如果我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

有关的:

c++ language-lawyer stdarray

2
推荐指数
1
解决办法
88
查看次数

如何将 std::sort 与 std::array 一起使用?

我需要对 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,但我不知道如何执行此操作,因为我不断收到错误。

c++ sorting stdarray

2
推荐指数
1
解决办法
230
查看次数

如何在C++中给出它的指针访问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)

这里发生了什么?
谢谢!

c++ pointers compiler-errors function stdarray

1
推荐指数
2
解决办法
2351
查看次数

在构造函数的初始化列表中使用std :: initializer_list初始化std :: array

考虑以下代码:

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::arraystd::initializer_list

c++ stl initializer-list c++11 stdarray

1
推荐指数
1
解决办法
2125
查看次数

std :: array和bytes read

我已经阅读了很多关于在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 []吗?

c++ fstream c++11 stdarray

1
推荐指数
1
解决办法
2080
查看次数

std :: array模板实例会占用更多代码内存吗?

我有一个没有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

c++ templates code-size c++11 stdarray

1
推荐指数
1
解决办法
107
查看次数

如何使用不同的值声明一个内联初始化的std :: array结构

我试图初始化一个结构数组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)

c++ struct c++11 stdarray

1
推荐指数
1
解决办法
73
查看次数

更改数组尺寸会导致崩溃C ++

我的程序中需要一些大数组,并且正在使用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)

c++ stdarray

1
推荐指数
1
解决办法
111
查看次数

如何使用模板为“ std :: array”声明“ using”

例如,我有类似的代码:

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

c++ arrays templates std stdarray

1
推荐指数
1
解决办法
96
查看次数