хранение адресов элементов std::list; объем памяти

Я создаю std::list элементов структуры. С определенным критерием я хочу сохранить адреса нескольких элементов (потому что эти адреса не меняются (?)) из списка в std::vector для быстрого доступа в другом использовании. Пример вещей приведен ниже

#include <iostream>
#include <vector>
#include <list>

struct Astruct{
  double x[2];
  int rank;
};


int main(int argc, char *argv[]) {


  std::list<Astruct> ants; 
  std::vector< Astruct* > ptr; 

  for (auto i = 0; i != 20; ++i) {
    Astruct local;
    local.x[0] = 1.1;
    local.x[1] = 1.2;
    local.rank = i;
    // put in list
    ants.push_back(local); 


    // store address of odd numbers
    // rather than temperory address, permenent address from list is needed
    if(local.rank %2 == 0) ptr.push_back(&local);
  }

  // print the selected elements using addresses from the list
  for(int num = 0; num != ptr.size(); num++){
    Astruct *local;
    local = ptr.at(num);
    std::cout << " rank  " << local->rank << "\n";
  }

  /*
  // quick way to check whether certain address (eg 3rd element) exists in the std::vector
  std::list<Astruct>::iterator it = ants.begin();
  std::advance(it , 2);
  for(int num = 0; num != ptr.size(); num++){
    if(it == ptr.at(num)) std::cout << " exists in vector \n " ;
  }

  */
  // print memory in bytes for all variables
  std::cout << " sizeof Astruct " << sizeof(Astruct) << "\n";
  std::cout << " sizeof ants " << sizeof(ants) << "\n";
  std::cout << " sizeof ptr " << sizeof(ptr) << "\n";
}
  1. Как получить доступ к адресу определенного элемента из списка?
  2. Эффективен ли метод добавления элементов в список? (в первом цикле)
  3. Как быстрее всего проверить, существует ли определенный адрес в векторе? (показано в блоке комментариев)
  4. Как тут определить размер памяти в байтах для разных переменных? (конец кода)

Спасибо.


person navin    schedule 30.08.2019    source источник
comment
Обратите также внимание, что вы помещаете указатели на локальную переменную в вектор ptr. На каждом этапе он будет удаляться из стека. Так у вас получится уб в следующую петлю.   -  person Alexey Medvedev    schedule 30.08.2019
comment
@AMedvedev Да, я знаю, что используется указатель на локальную переменную, и я указал в комментарии выше, что это не ожидается.   -  person navin    schedule 30.08.2019
comment
Хорошо, тогда подумайте об использовании std::set или hash_set вместо вектора. vector будет эффективен, если количество адресов невелико. Но если у вас будет много адресов, то можно выбрать контейнеры с доступом быстрее линейного.   -  person Alexey Medvedev    schedule 30.08.2019


Ответы (1)


  1. Как получить доступ к адресу определенного элемента из списка?

    • address=&(*iterator);
  2. Эффективен ли метод добавления элементов в список? (в первом цикле)

    • the first loop does not use the list at all! (Ah, OK, after edition it does)
    • все адреса, хранящиеся в векторе, ссылаются на локальную переменную, которая исчезает после каждой итерации; это поведение undefined (весьма вероятно, но ничего не известно, все эти адреса одинаковые)
  3. Как быстрее всего проверить, существует ли определенный адрес в векторе? (показано в блоке комментариев)

    • usualy std::find() from <algorithm> is suitable.
  4. Как тут определить размер памяти в байтах для разных переменных? (конец кода)

    • std::cout << " sizeof Astruct " << sizeof(Astruct) << "\n"; is OK
    • std::cout << " sizeof ants " << size(ants)*sizeof(Astruct) << "\n"; является приблизительным, поскольку мы не знаем накладных расходов на список и его узлы.
    • std::cout << " sizeof ptr " << size(ptr)*sizeof(Astruct *) << "\n"; является приближением, так как мы не знаем накладных расходов вектора
person prog-fh    schedule 30.08.2019