C++ 存储std::list元素的地址;记忆

C++ 存储std::list元素的地址;记忆,c++,memory,stdvector,stdlist,C++,Memory,Stdvector,Stdlist,我正在创建结构元素的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
。根据某种标准,我希望将少数元素的地址(因为这些地址不会从列表中更改(?)存储到
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";
}
#包括
#包括
#包括
结构构造{
双x[2];
整数秩;
};
int main(int argc,char*argv[]){
名单蚂蚁;
std::vectorptr;
用于(自动i=0;i!=20;++i){
局部构造;
local.x[0]=1.1;
local.x[1]=1.2;
local.rank=i;
//列入名单
蚂蚁。推回(本地);
//奇数存储地址
//需要列表中的永久地址,而不是临时地址
如果(local.rank%2==0)ptr.push_-back(&local);
}
//使用列表中的地址打印所选元素
for(int num=0;num!=ptr.size();num++){
Astruct*本地;
本地=ptr.at(数量);
标准::cout
  • 如何从列表中访问特定元素的地址

    • 地址=&(*迭代器);
  • 将元素添加到列表中是否有效?(在第一个for循环中)

    • 第一个循环根本不使用列表!(啊,好的,编辑后它会使用)
    • 存储在向量中的所有地址都引用了一个局部变量,该变量在每次迭代后都会消失;这是未定义的行为(很可能,但没有什么是确定的,所有这些地址都是相同的)
  • 检查向量中是否存在特定地址的最快方法是什么?(在注释块中显示)

    • 通常
      中的
      std::find()
      是合适的
  • 如何确定不同变量的内存大小(字节)(代码结束)


    • std::也请注意,您将指向局部变量的指针放入ptr向量中。在每个步骤中,它都将从堆栈中删除。因此,您将在下一个循环中使用UB。@AMedvedev是的,我知道使用了指向局部变量的指针,并且我在上面的注释中指出它不是预期的OK,然后考虑using std::set或hash_set而不是vector。如果地址数很小,vector会很有效。但是如果有很多地址,那么可以选择访问速度比线性更快的容器。