我有一个表示一个树对象的类,它使用唯一的指针,构成树的一些节点,以及一个基于某些参数构造指向抽象节点类的指针的函数(它生成指向子类的指针,因为抽象节点是抽象的)
class AbstractNode
{
vector<unique_ptr<AbstractNode>> children;
public:
AbstractNode(arguments...);
// other stuff...
};
class Tree
{
unique_ptr<AbstractNode> baseNode;
// other stuff...
}
unique_ptr<AbstractNode> constructNode(AbstractNodeTypes type);
Run Code Online (Sandbox Code Playgroud)
abstractNode有各种子类,它们将包含在树中.子类为该类中的某些虚函数提供了不同的实现.
我希望能够通过创建一组具有相同类类型的新节点来复制我的树,这些类型是原始树中节点的不同副本.
如果我为AbstractNode深度复制子类的类编写自己的复制构造函数,我将不得不为所有子类编写复制构造函数AbstractNode,这看起来很烦人,因为唯一不能正确复制的是子指针.在这里使用复制构造函数也很烦人,因为我需要在调用它们之前将它们转换为正确的类型,我想.
有没有什么方法可以让编译器让我使用默认的复制构造函数来设置除孩子之外的所有东西.它可以将那些作为空指针或其他东西?然后我可以编写一个更简单的函数,只是递归地添加子项来复制树.
如果这是不可能的,那么任何人都知道这个问题是否有任何非丑陋的解决方案?
我试图了解该for x in y语句在 python 中的工作原理。我在这里找到了文档:https : //docs.python.org/3/reference/compound_stmts.html#for。它表示表达式y被评估一次并且必须产生一个可迭代对象。
即使我的类没有实现__iter__(这是我对可迭代的理解),以下代码也会打印数字 1,2,3,4,5 。
class myclass:
def __init__(self):
self.x = [1,2,3,4,5]
def __getitem__(self,index):
return self.x[index]
m = myclass()
for i in m:
print(i)
Run Code Online (Sandbox Code Playgroud)
我知道有一个内置方法iter()可以使用它的.__getitem__()函数和一个从 0 开始的计数器返回一个序列对象的迭代器。
我的猜测是,蟒蛇被调用iter()的函数表达式y中for x in y声明。所以它正在将我实现的对象.__getitem__转换为迭代器,当我的对象IndexError在.__getitem__调用过程中引发异常时,迭代器将其转换为StopIteration异常,然后 for 循环结束。
这样对吗?对还是错,这是否在文档中的某处进行了解释,还是我需要查看实现的源代码?
我正在学习有关类似的方法argwhere,并nonzero在NumPy的。numpy.nonzero(x)该函数似乎返回一个一维ndarray对象元组,因此该函数的输出可用于索引。
我还没有准备好C源代码,nonzero因为我不知道如何找到它。但是,我想该nonzero函数将构造一个mbyndim ndarray对象(对于某些m取决于输入的对象),该对象将保存a. 为了验证这个猜测是正确的,我尝试了:
import numpy as np
from numpy.random import Generator, PCG64
rg = Generator(PCG64())
x = rg.integers(0,2,(10000,10000))
y = np.nonzero(x)
print(y[0].base is y[1].base)
z = y[0].base
print(type(z),z.shape)
print(np.array_equal(z[:,0].reshape(-1),y[0]))
print(np.array_equal(z[:,1].reshape(-1),y[1]))
Run Code Online (Sandbox Code Playgroud)
输出:
True
<class 'numpy.ndarray'> (50005149, 2)
True
True
Run Code Online (Sandbox Code Playgroud)
我对上述内容的解释是该nonzero函数确实构造了一个m按ndim大小排列的数组。
还有一个np.argwhere(x)功能。与 不同np.nonzero,它将返回一个m按ndim大小排列的数组,而不是一个元组。Reason 表明argwhere …
我有很多抽象类字母的子类,如A,B,C,D等.字母有一个整数ID变量,并且Letter的每个子类都被赋予一个唯一的id.
然后我有另一个班,称之为Alphabet.字母表有一个
list<shared_ptr<Letter>>
Run Code Online (Sandbox Code Playgroud)
会员.这是问题...我想优雅地将B和C或其他子类的Letter添加到字母的特定实例中.我认为最方便的方法是以某种方式使用子类的整数id.换句话说,我希望能够有像Alphabet.addLetter(int id)这样的东西,所以如果我做了alphabet1.add(14),它会以某种方式将H类的shared_ptr添加到列表中.
有没有一种优雅的方法来做到这一点,避免一些巨大的if语句,我需要不断更新每次添加或删除B,C,D,E等类之一?我希望有一些模板解决方案,但我不熟悉工厂和模板等高级c ++概念.我想要的天真的东西是某种矢量/地图,它将我的id转换为类名,这样我就可以做类似的事情
list.push_back(shared_ptr<classVector(i)>(new classVector(i))
Run Code Online (Sandbox Code Playgroud)
或类似的东西,虽然我不知道这是否可能.
谢谢!
ps我刚刚选择了Alphabet示例,因为我不想给出不必要的细节.显然,我不是试图以这种愚蠢的方式设计字母表,哈哈.
编辑:我正在努力使这有意义.我的目标是能够以最小的努力快速创建Letter的新子类.我想避免输入看起来像......的代码
list.push_back(shared_ptr<X>(...));
Run Code Online (Sandbox Code Playgroud)
每次我写一封新信.这有意义吗?
我想绘制大量的四边形,每个四边形代表曲线的一小段,以便曲线看起来平滑但实际上仅由线性部分组成。我还希望能够设置线条的粗细和线条混合部分的粗细,以便在混合区域中线条线性地失去其 alpha 分量。理想情况下,这些线能够在 3D 场景中以任何方式定向,尽管它们通常位于面向相机的平面中。
问题在于,很难将线条与背景混合在一起,而不使重叠的线段相互作用,从而在许多重叠的地方变得更亮。我只希望线条的 1 个片段与背景混合,但如果单独渲染每个四边形,则很难知道哪个片段是正确的。
有没有一种有效的方法来做这样的事情?或者我是否必须进行某种预处理才能将线变成 1 个网格,而不是将其渲染为一堆四边形?
[这是线条相互交叉且混合不正确的问题的图片]
https://i.stack.imgur.com/ydIPx.png
这是一个相关的问题,但它有所不同,因为我想混合四边形,以便它们线性脱落。如果您从此线程实现解决方案,那么混合看起来会不正确。