使用结构对象

Posted

技术标签:

【中文标题】使用结构对象【英文标题】:Working with structure objects 【发布时间】:2015-04-29 06:42:07 【问题描述】:

我的逻辑如下所示(不是实际代码):

StructureElement x;

For i in 1 to 1000

do
    x.Elem1 = 20;
    x.Elem2 = 30;
    push(x into a std::vector)   
end 

我的知识是 x 只分配一次内存,并且每次迭代都会覆盖现有值。 此外,推送到向量中的“x”不会受到后续推送修改后的“x”迭代的影响。

我的观察是否正确?

以上是最优的吗?我希望尽量减少内存消耗,并且不喜欢使用 new。我不使用 new 是否遗漏了什么?

另外,我传递了这个向量并通过另一种方法接收对它的引用。

而且,如果我要读回向量元素,对吗?

Structure element xx = mYvector.begin()
print xx.Elem1
print xx.Elem2

欢迎任何优化或不同的想法。

【问题讨论】:

@MykhayloKopytonenko 这是伪代码。 【参考方案1】:

我的观察是否正确?

是的,如果向量是std::vector<StructureElement>,在这种情况下,如果被推入,它会保留自己的副本。

以上是最优的吗?

这是次优的,因为它会导致向量底层数据缓冲区的许多重新分配,以及不必要的分配和复制。编译器可能会优化一些赋值并复制掉,但没有理由,例如,在循环中重新设置 x 的元素。

你可以这样简化:

std:vector<StructureElement> v(1000, StructureElement20, 30);

这将创建一个大小为 1000 的向量,其中包含具有所需值的 StructureElement 的副本,这似乎是您在伪代码中尝试的。

要回读元素,您可以选择。如果要遍历所有元素,则基于范围的 for 循环:

for (const auto& e: v):
  std::cout << e.Elem1 << " " << e.Elem2 << std::endl;

使用迭代器,

for (auto it = begin(v); it != end(v); ++it)
   std::cout << it->Elem1 << it->Elem2 << std::endl;

或者,将范围传递给算法

std::transform(begin(v), end(v), ....);

【讨论】:

如果 (20,30) 组合是可变的怎么办?如果我在运行时阅读它们会怎样? @thenoGk 同样适用。在这里没有区别。 谢谢,请给我一些时间研究一下。

以上是关于使用结构对象的主要内容,如果未能解决你的问题,请参考以下文章

为啥Java使用堆数据结构来存储对象? [复制]

使用 sequelize 创建具有关联层次结构的对象

使用 json 对象列表以角度生成层次结构视图

使用 Java Stream api 从对象层次结构中提取数据 [关闭]

使用结构对象

10,组合模式(Composite Pattern)是将对象组合成树形结构以表示“部分--整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。