使用结构对象

Working with structure objects

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

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

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

Am I right in my observations?

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

Is the above optimal?

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

你可以这样简化它:

std:vector<StructureElement> v(1000, StructureElement{20, 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), ....);