Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何声明一对对的任意深度?_C++_Std - Fatal编程技术网

C++ 如何声明一对对的任意深度?

C++ 如何声明一对对的任意深度?,c++,std,C++,Std,一对int可以声明为:std::pair A 类似地,一对int作为std::pairA 我想在代码中声明任意的“成对”。i、 例如,根据某些值(仅在运行时已知),我想要一对int(n=1)或一对int(n=2),依此类推。想知道如何在C++中有效地执行它? 以下是Python中的代码片段: import numpy as np n = 4 # a value known at runtime m = 2 # a value known at runtime def PP(A, j):

一对int可以声明为:
std::pair A
类似地,一对int作为
std::pairA
我想在代码中声明任意的“成对”。i、 例如,根据某些值(仅在运行时已知),我想要一对int(
n=1
)或一对int(
n=2
),依此类推。想知道如何在C++中有效地执行它? 以下是Python中的代码片段:

import numpy as np

n = 4 # a value known at runtime
m = 2 # a value known at runtime
def PP(A, j):
    A_s = []
    if j == n-1:
        for i in range(1, m):
            A_s.append((i, A[i]))
    else:
        for i in range(1, m):
            A_c = A[i]
            A_s.append((i, PP(A_c, j+1)))
    return A_s

j = 0
# The dimension of A is known at runtime.
# Will have to create np.ones((m, m, m, m, m)) if n = 5
A = np.ones((m, m, m, m))
B = PP(A, 0)

不像Python,C++是一个。因此,如果要存储的内容的结构或大小直到运行时才知道,则不能使用类型本身(如嵌套对)来描述特定的结构。相反,您所做的是使用可以动态调整大小的C++类型。也就是说,在C++中存储动态数量的int值是一种惯用且有效的方法。

如果你真的想要一个树形结构,如你的Python例子(<代码> [(1,[(1,[(1,(1,1)])] ] < /代码>),这也是C++中的可能。但这需要更多的工作。例如,请参见。

C++(参见和,C++11标准草案)同时包含和(在C++17中)。似乎你想要一些(比如内部C++编译器)和(例如)< /P> 也许你想要像这样的东西

class Foo; // forward declaration
class Foo {
  std::variant<std::unique_ptr<Foo>, std::pair<int,int>> fields;
  /// many other things, in particular for the C++ rule of five
};
class Foo;//远期申报
福班{
std::变量字段;
//许多其他的东西,特别是对于C++五的规则
};
与Python相比,每个C++值都有已知类型。 您可以将两者巧妙地结合起来,并且您可能会对其他标准感兴趣(尤其是)。请阅读并注意以下事项

从或上现有的开源软件(如、、和许多其他软件)中获取灵感

还读取C++编译器(例如)和调试器(例如)的文档。如果使用最新的GCC,请编译所有警告和调试信息,例如

g++-Wall-Wextra-g
。文档通过编写编码约定,并且对于足够大的代码库,考虑编写您的代码来执行它们。最近的GCC(因此在2020年10月)有一些有趣的选择,您可以尝试

<>考虑在C++代码库中使用(也见报告和欧洲项目),

阅读近期会议上关于C++的论文。 也可以定义你的代码>类矩阵< />,或者使用现有的库提供它们(例如),也许适应C++。


<>请记住,<>代码> >每个C++类型在编译时都是已知的。另外,C++没有任何(如C)。正如别人已经说过的,你不能做。至少在运行时不是这样

然而,一般来说,它似乎也没有用处。假设您具有以下类型(与您的类型类似,但在编译时具有已知的嵌套级别),并且您声明了该类型的对象

使用您的_type=std::pair
您的_类型obj1{1,{2,{3,4}}};
这和

std::数组obj2{1,2,3,4};
如果您有此信函:

  • obj1.first==obj2[0]
  • obj1.second.first==obj2[1]
  • obj1.second.second.first==obj2[2]
  • obj1.second.second.second==obj2[3]
要强调它们实际上是同一件事,请考虑如何为这种类型实现
size
函数;它可能是这样的元函数(可能有更好的方法):

模板
constexpr int size(标准::对){
如果constexpr(std::is_same_v)
返回2;
其他的
返回1+大小(Ts{});
}
换句话说,它们是同构的

现在,您的需求是编写
您的_类型
,以便在运行时知道嵌套级别。如前所述,这是不可能的,但是猜猜什么是与你想象的类型同构的<代码>标准::向量

所以我的答案是:你不需要它;只需使用std::vector


最后,根据我的回答,如果您真的想要一个行为类似于任意嵌套对的类型,那么您可以在
std::vector
周围编写一个包装器。但是我不明白为什么您可能真的需要这样做。

听起来像是一对整数对总共有四个整数,但是
std::pair
只有三个:)您无法在运行时真正确定某个对象的类型。你能举一个小例子说明你会如何使用它吗?这听起来很像
std::vector
你的实际问题是什么?你在写什么样的代码?请在你的问题中提供一些C++(不是Python)。