标签: stdarray

如何使用没有默认构造函数的std :: transform创建std :: array

我有一个std::array<Foo, 10>,我想一个创建std::array<Bar, 10>使用函数从FooBar.通常我会这样使用std::transform:

array<Bar, 10> bars;
transform(foos.begin(), foos.end(), bars.begin(), [](Foo foo){
    return Bar(foo.m_1, foo.m_2);
});
Run Code Online (Sandbox Code Playgroud)

但是,Bar没有默认构造函数,所以我无法创建bars数组.我总是可以使用,vector但能够array用来保证我总是有10个元素会很好.那可能吗?

c++ vector std c++11 stdarray

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

为什么C数组比std :: array快得多?

我们目前正在用C++编写一些性能关键代码,它们可以在许多大型矩阵和向量上运行.关于我们的研究,std::array标准C阵列之间应该没有重大的性能差异(参见这个问题或者这个).但是,在测试过程中,我们通过使用C阵列获得了巨大的性能提升std::array.这是我们的演示代码:

#include <iostream>
#include <array>
#include <sys/time.h>

#define ROWS 784
#define COLS 100
#define RUNS 50

using std::array;

void DotPComplex(array<double, ROWS> &result, array<double, ROWS> &vec1, array<double, ROWS> &vec2){
  for(int i = 0; i < ROWS; i++){
    result[i] = vec1[i] * vec2[i];
  }
}

void DotPSimple(double result[ROWS], double vec1[ROWS], double vec2[ROWS]){
  for(int i = 0; i < ROWS; i++){
    result[i] = vec1[i] * vec2[i];
  }
}

void MatMultComplex(array<double, ROWS> &result, array<array<double, COLS>, ROWS> …
Run Code Online (Sandbox Code Playgroud)

c++ arrays performance c++11 stdarray

16
推荐指数
2
解决办法
3045
查看次数

为什么 std::array&lt;T,0&gt; 根据 libc++ 中的 T 调整大小和对齐?

在 libc++ 中, 的特化std::array<T,0>有一个成员 ( const)char数组,该数组根据T() 进行对齐和调整大小。我想知道这个实现的原因是什么,因为这个成员(__elems_)似乎没有在任何地方使用。为了进行比较,libstdc++使用空成员,而Microsoft STL如果不可默认构造则使用空成员T(否则,它会创建单元素数组)。

差异的现场演示:https ://godbolt.org/z/1o167na6z

c++ libc++ stdarray

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

对于数组来说,std :: array转换的C-Style数组是否完全安全?

第一次提问者:)是否有可能在不破坏代码的情况下将全局c样式数组转换为std :: arrays?我正在开发一个项目,其中包括反编译旧游戏的源代码.我们已经设法重构了反汇编/反编译输出的大部分内容.因为它是自动的,所以仍然有像

  int a;
  int b[50];
  *(&a + 100) = xxx;
Run Code Online (Sandbox Code Playgroud)

要么

  int b[50];
  int a;
  *(&a - 100) = xxx;
Run Code Online (Sandbox Code Playgroud)

还有其他类型的疯狂指针算术,它们尚未手动重构.但我们想使用边界检查已经(可能)正确更改为数组的部分.

(忽略斜体文本,我只是为了保持评论的一致性)到目前为止,我发现每个数组都有一个问题:sizeof(class containing array)会改变.这可能会在某些周期中破坏代码,例如someclass somearray [100]; //例如(sizeof(somearray [0])== 50)是真的int指针=(int)somearray; 指针+ = 100((someclass)指针) - > doSomething(); .因为pointer +=100不是指向第二个元素,而是指向第一个元素,或者甚至是第0个元素,我不确定(不要忘记它是自动反编译的代码,因此是丑陋的).

我正在考虑将每个全局数组更改为std :: array以及在没有[]运算符的情况下访问数组的每个实例array._Elems.

如果我要在这样的代码中将全局数组更改为std :: arrays,是否会出现任何问题?

编辑 你是对的,大小不变.我在测试功能中出错了.所以我会扩展这个问题:

将每个c样式数组更改为std :: array是否安全?

编辑 我们当前的代码实际上只能在调试模式下运行,因为它不会移动变量.发布模式基本上在程序开始时崩溃.

编辑 因为这个问题似乎有些混乱,让我澄清一下:除了T elems [N]之外,是否有一些保证阵列中没有其他成员?我能指望拥有

array<array<int,10>, 10> varname;
int* ptr = &varname[0][0];
ptr += 10
Run Code Online (Sandbox Code Playgroud)

varname[1][0] …

c++ arrays disassembly c++11 stdarray

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

初始化std :: array <>

请考虑以下代码:

#include <array>

struct A
{
    int a;
    int b;
};

static std::array<A, 4> x1 =
{
        { 1, 2 },
        { 3, 4 },
        { 5, 6 },
        { 7, 8 }
};

static std::array<A, 4> x2 =
{
    {
        { 1, 2 },
        { 3, 4 },
        { 5, 6 },
        { 7, 8 }
    }
};

static std::array<A, 4> x3 =
{
       A{ 1, 2 },
       A{ 3, 4 },
       A{ 5, 6 },
       A{ 7, 8 …
Run Code Online (Sandbox Code Playgroud)

c++ aggregate-initialization c++11 stdarray

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

std::array 的分段初始化

如何编写std::array串联函数?

template <typename T, std::size_t sza, std::size_t szb>
std::array<T, sza+szb> concat (const std::array<T, sza>& aa, 
                                const std::array<T, szb>& ab)
{
    std::array<T, sza+szb> result;
    std::copy(std::begin(aa), std::end(aa), std::begin(result));
    std::copy(std::begin(ab), std::end(ab), std::begin(result) + sza);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

T当不可默认构造时,这当然不起作用。如何解决这个问题?

c++ stdarray c++20

15
推荐指数
3
解决办法
780
查看次数

std :: valarray和std :: array之间有什么区别

valarray类的外观的同时,以array一流的,可以请你解释我在哪里,我宁愿valarrayarray反之亦然?

c++ valarray stdarray

14
推荐指数
3
解决办法
6448
查看次数

什么是.begin()和.end()?

在C++库数组中,在哪些情况下,拥有.begin().end()成员函数是有用的?

在cplusplus.com上,示例用法是遍历数组:

for ( auto it = myarray.begin(); it != myarray.end(); ++it )
Run Code Online (Sandbox Code Playgroud)

for (int i = 0; i < myarray.size(); i++)
Run Code Online (Sandbox Code Playgroud)

可以用于此.

c++ arrays std stdarray

14
推荐指数
3
解决办法
1538
查看次数

为什么用 C++ std::array 创建二维数组需要一对额外的 {}

要使用 std::vector 创建二维数组,您可以

vector<vector<int>> array2d = {{1, 2,  3,  4},
                               {5, 6,  7,  8},
                               {9, 10, 11, 12}};
Run Code Online (Sandbox Code Playgroud)

外层 {} 代表外层向量;内部 {},内部向量。

但是,要使用 std::array 创建二维数组,您需要执行以下操作

array<array<int,4>, 3> array2d = {{{1, 2,  3,  4},
                                   {5, 6,  7,  8},
                                   {9, 10, 11, 12}}};
Run Code Online (Sandbox Code Playgroud)

为什么 std::array 的 std::array 需要一对额外的封闭 {}?

c++ stdarray

14
推荐指数
0
解决办法
120
查看次数

优雅地声明2(甚至多维)维std :: arrays

我正在使用基于的二维数组std::array

基本上代替:

MyType myarray[X_SIZE][Y_SIZE];
Run Code Online (Sandbox Code Playgroud)

我有:

std::array<std::array<MyType, Y_SIZE>, X_SIZE> myarray;
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但是IMO的声明不是很可读。

有没有一种方法可以使用一些聪明的C ++模板机制来声明,所以声明可能看起来像这样?

My2DArray<Mytype, X_SIZE, Y_SIZE> myarray;
Run Code Online (Sandbox Code Playgroud)

c++ stdarray

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