使用结构对象
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 Stream api 从对象层次结构中提取数据 [关闭]
10,组合模式(Composite Pattern)是将对象组合成树形结构以表示“部分--整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。