2015-04-29 2 views
1

У меня есть логика, которая выглядит как ниже (не фактический код):Работа со структурой объектов

StructureElement x; 

For i in 1 to 1000 

do 
    x.Elem1 = 20; 
    x.Elem2 = 30; 
    push(x into a std::vector) 
end 

Мои знания в том, что х будет выделена память только один раз, и что существующие значения будут переписаны для каждого итерация. Кроме того, «x», вдвинутый в вектор, не будет влиять на последующие итерации нажатия модифицированного «x».

Я прав в своих наблюдениях?

Является ли выше оптимальным? Я хотел бы сохранить минимальное потребление памяти и не хотел бы использовать . Я что-то пропустил, не используя ?

Кроме того, я передаю этот вектор и получаю ссылку на него другим методом.

И, если бы я должен был прочитать элементы вектора назад, это правильно?

Structure element xx = mYvector.begin() 
print xx.Elem1 
print xx.Elem2 

Любая оптимизация или разные идеи приветствуются.

+0

Это не C++ –

+0

@MykhayloKopytonenko Это псевдокод. – Lundin

ответ

3

Я прав в своих наблюдениях?

Да, если вектор std::vector<StructureElement>, в этом случае она сохраняет свои собственные копии, если то, что нажат.

ли выше оптимальной?

Это неоптимально, потому что это приводит к множеству перераспределений базового буфера данных вектора, а также ненужным присваиваниям и копиям. Компилятор может оптимизировать некоторые из присвоений и копий, но нет причин, например, повторно установить элементы x в цикле.

Вы можете упростить это следующим образом:

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

Это создает вектор размерно-1000, содержащие копии StructureElement с заданными значениями, что является то, что вы, кажется, пытаются в вашей псевдо-коде.

Чтобы прочитать элементы назад, у вас есть варианты. Диапазон основе для цикла, если вы хотите перебрать все элементы:

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), ....); 
+0

Что делать, если комбинация (20,30) является переменной? Что, если я прочитаю их во время выполнения? – thenoGk

+0

@thenoGk То же самое относится. Здесь нет никакой разницы. – juanchopanza

+0

Спасибо, пожалуйста, дайте мне время, чтобы изучить его. – thenoGk

Смежные вопросы