使用结构对象

Working with structure objects

本文关键字:对象 结构      更新时间:2023-10-16

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

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

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

我的观察是对的吗?

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

以上是最佳的吗?

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

您可以像这样简化它:

std:vector<StructureElement> v(1000, StructureElement{20, 30});

这将创建一个 size-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), ....);