如何使用一维数组列表初始化二维数组?
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'))
)
}
答案 0 :(得分:12)
原始数组是第二类公民。它们不能被分配,它们也不能被复制,这意味着您可以使用它们来初始化其他数组,并且它们的名称在大多数情况下会变成指针。
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 };
答案 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
应用于a
和b
...
反之亦然:创建一个指针数组
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 << " ";