当交换或移动对象数组时,如果假设数组中有指针指向随机对象,会发生什么。指针是否跟随objects元素移动?如果他们不这样做,有没有办法让他们这样做?
对象不会移动。对象中的值可以移动(或交换或复制(到不同的对象中。
指针指向对象。如果这些对象的值发生了更改,指针将指向更改后的值。如果对象的生存期结束,指针将挂起。
当交换或移动对象数组时,如果假设数组中有指针指向randomn对象,会发生什么。指针是否跟随objects元素移动
指针将指向与以前相同的内存地址。如果更改数组中的值,则对指针没有影响。
如果他们不这样做,有办法让他们这样做吗
是的,有一种方法,你只需要让它们指向你想让它们指向的任何地方。
示例:
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *ptr = &array[5]; // pointing to array[5]
printf("%dn", *ptr); // prints 6
array[5] = 20; // changing the value if array[5]
printf("%dn", *ptr); // still pointing to array[5], prints 20
ptr = &array[2]; // now pointing to array[2]
printf("%dn", *ptr); // prints 3
当然,这必须应用于您所说的交换方法,您没有显示任何代码,因此我无法举例说明。
当对象在数组中移动时,有一些方法可以让指针跟随对象。最简单的方法是在数组中移动对象时简单地修改指针。
T arr[5];
T* ptr = &arr[3]; //point to the third element
std::swap(arr[1], arr[3]); //swap array element 1 with 3
ptr = &arr[1]; //update the pointer to point to element 1
我认为您所要求的是在不修改指针以指向对象新位置的情况下移动/交换对象。最简单的方法,也是您看到最多的方法,是在堆上分配一个指向对象的指针数组(这里使用std::shared_ptr
实现(。
std::shared_ptr<T> arr[5]; //array of 5 shared_ptr<T>
arr[0] = new T();
arr[1] = new T();
arr[2] = new T();
arr[3] = new T();
arr[4] = new T();
T* ptr = &*arr[3]; //point to the third element
std::swap(arr[1], arr[3]); //swap array element 1 with 3
//no need to update the pointer
这是因为shared_ptr
在堆上分配T
(参见new operator
(,所以交换arr[1]
和arr[3]
意味着ptr
仍然指向相同的T
。注意未编译或测试的代码。
注意,这适用于任何可修改的连续或非连续数据存储,例如std::vector<T>
,而不是数组。