【问题标题】: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 这是伪代码。

标签: c++ vector struct


【解决方案1】:

我的观察是否正确?

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

以上是最优的吗?

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

【讨论】:

  • 如果 (20,30) 组合是可变的怎么办?如果我在运行时阅读它们会怎样?
  • @thenoGk 同样适用。在这里没有区别。
  • 谢谢,请给我一些时间研究一下。
猜你喜欢
  • 1970-01-01
  • 2011-08-02
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多