使用结构对象
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), ....);
我的逻辑如下所示(不是实际代码):
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), ....);