如何使用一维数组列表初始化二维数组?

时间:2019-01-09 15:56:30

标签: c++ arrays multidimensional-array

如何使用一维数组列表初始化二维数组?

import { base64url } from 'rfc4648'

async function verify (jwsObject, jwKey) {
  const jwsSigningInput = jwsObject.split('.').slice(0, 2).join('.')
  const jwsSignature = jwsObject.split('.')[2]
  return window.crypto.subtle
    .importKey('jwk', jwKey, { 
         name: 'RSASSA-PKCS1-v1_5', 
         hash: { name: 'SHA-256' } 
       }, false, ['verify'])
    .then(key=>
      window.crypto.subtle.verify(
        { name: 'RSASSA-PKCS1-v1_5' },
        key,
        base64url.parse(jwsSignature, { loose: true }),
        new TextEncoder().encode(jwsSigningInput))
      ).then(isValid => alert(isValid ? 'Valid token' : 'Invalid token'))
    )
}

4 个答案:

答案 0 :(得分:12)

C ++中的

原始数组是第二类公民。它们不能被分配,它们也不能被复制,这意味着您可以使用它们来初始化其他数组,并且它们的名称在大多数情况下会变成指针。

Lucky C ++ 11提供了一种解决方案。 std::array的作用类似于原始数组,但是没有缺点。您可以改用它们来构建二维数组,例如

std::array<int, 3> foo = {1,2,3};
std::array<int, 3> bar = {3,4,5};
std::array<std::array<int, 3>, 2> baz = {foo, bar};

如果您有C ++ 17支持,则可以利用class template argument deduction摆脱必须指定模板参数的麻烦,并且代码简化为

std::array foo = {1,2,3};
std::array bar = {3,4,5};
std::array baz = {foo, bar};

您可以在此live example中看到

答案 1 :(得分:5)

使用std::array

auto a = std::array{ 1,2,3 };
auto b = std::array{ 4,5,6 };
auto array = std::array{ a,b };

Demo

答案 2 :(得分:5)

您的呈现方式-根本不...您可以:

int array[][3] = { { 1, 2, 3 }, { 4, 5, 6 } };

如果仍然需要a和b,则可以将它们用作指针:

int* a = array[0];
int* b = array[1];

或更接近您的原始尝试:对数组的引用:

int(&a)[3] = array[0];
int(&b)[3] = array[1];

这样,您仍然可以G。将sizeof应用于ab ...

反之亦然:创建一个指针数组

int a[] = { 1,2,3 };
int b[] = { 4,5,6 };
int* array[] = { a, b };

到目前为止,所有这些解决方案都具有一个共同点,即a和array [0]都访问完全相同的数据。如果您实际上想拥有两个 individual 副本,那么就无法将数据从一个复制到另一个。 G。通过std::copy

但是,如果您从原始数组切换到std::array,则可以直接进行这种初始化(带有副本):

std::array<int, 3> a;
std::array<int, 3> b;
std::array<std::array<int, 3> 2> array = { a, b };

答案 3 :(得分:3)

std::array是这里的解决方法,但是如果您要坚持使用语言的方法(而不是标准库),并且合并后的数组与其组成部分具有相同的生存时间,并且数据可以共享,你可以有一个指向数组的数组并说

int a[] { 1,2,3 };
int b[] { 4,5,6 };

decltype(a) *abArr[] {&a, &b};
// equivalent to 
// int (*abArr[])[3] { &a, &b };

请注意,这不是二维数组,并且其元素也不是整数。 但是,您仍然可以在两个维度上进行范围循环,因为指针是指向固定大小数组的真实指针(与由于数组衰减而导致的仅指向int的指针相反,无法进行范围循环)。

由于数组元素是指针,因此必须取消引用row

for (auto const& row : abArr)
    for (auto const& e : *row)
        cout << e << " ";

实时示例:http://coliru.stacked-crooked.com/a/cff8ed0e69ffb436