我有一个std::array<Foo, 10>,我想一个创建std::array<Bar, 10>使用函数从Foo到Bar.通常我会这样使用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++编写一些性能关键代码,它们可以在许多大型矩阵和向量上运行.关于我们的研究,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) 在 libc++ 中, 的特化std::array<T,0>有一个成员 ( const)char数组,该数组根据T(源) 进行对齐和调整大小。我想知道这个实现的原因是什么,因为这个成员(__elems_)似乎没有在任何地方使用。为了进行比较,libstdc++使用空成员,而Microsoft STL如果不可默认构造则使用空成员T(否则,它会创建单元素数组)。
差异的现场演示:https ://godbolt.org/z/1o167na6z
第一次提问者:)是否有可能在不破坏代码的情况下将全局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] …
请考虑以下代码:
#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) 如何编写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当不可默认构造时,这当然不起作用。如何解决这个问题?
valarray类的外观的同时,以array一流的,可以请你解释我在哪里,我宁愿valarray过array反之亦然?
在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)
可以用于此.
要使用 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 需要一对额外的封闭 {}?
我正在使用基于的二维数组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)