C++ 如何声明一对对的任意深度?
一对int可以声明为: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):
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)。