c++ - 更改为 vector 后如何维护指向 vector 元素的引用/指针/链接?

标签 c++ pointers vector data-structures reference

我有一个自定义类的 std::vector(为简单起见,在示例中使用 int)。我想保留指向 vector 成员的引用/指针/链接/其他。但是, vector 经常删除和添加元素。

为了说明我的观点,在下面的示例中,我采用了指向 vector 第二个元素的引用或指针。我使用引用/指针来增加所选元素的值。然后我删除第一个元素,并使用 ref/pointer 再次递增。

引用范例:

std::vector<int> intVect = {1,1,1};
int& refI = intVect.at(1);
refI++;
intVect.erase(intVect.begin());
refI++;

智能指针示例:

std::vector<int> intVect2 = {1,1,1};
std::shared_ptr<int> ptrI = std::make_shared<int>(intVect2.at(1)) ;
*ptrI = *ptrI +1;
intVect2.erase(intVect2.begin());
*ptrI = *ptrI +1;

我希望发生的事情是引用元素的值为 3,最终 vector 由 {3,1} 组成。但是,在引用示例中,最终 vector 是 {2,2},而在指针示例中,最终 vector 是 {1,1}

了解指针本质上是一个内存地址,我可以理解为什么这种方法可能行不通,但如果行得通,请告诉我。

更重要的问题是,可以使用什么替代方法或结构来允许某种形式的 ref/pointer/link/other 到该元素(无论是值还是对象) ) 在向包含它的 vector (或其他结构)添加成员或从中删除成员后是否可行?

额外学分:

我实际使用的对象有一个 position 属性。我有第二个结构,需要跟踪对象以快速查找哪些对象位于哪些位置。我目前正在使用网格( vector 的 vector )来表示可能的位置,每个网格都将索引保存到当前位于该位置的对象的对象 vector 中。但是,当一个对象从 vector 中删除时(这种情况非常频繁,每次迭代最多数百次),我目前的做法是遍历每个网格位置并递减任何大于删除索引的索引,这既慢又笨拙.非常感谢在上下文中对这个问题的其他想法,但我的关键问题与上述示例有关。

最佳答案

一个可能的选择是让 vector 存储 std::shared_ptr 对象,并发出 std::weak_ptrstd::shared_ptr对象引用相关对象。

std::vector<std::shared_ptr<int>> ints;
for(size_t i = 0; i < 10000; i++) {
    ints.emplace_back(std::make_shared<int>(int(i)));
}
std::weak_ptr<int> my_important_int = ints[6000];
{
    auto lock = my_important_int.lock();
    if(lock) std::cout << *lock << std::endl;
    else std::cout << "index 6000 expired." << std::endl;
}

auto erase_it = std:remove_if(ints.begin(), ints.end(), [](auto & i) {return (*i) > 5000 && ((*i) % 4) != 0;});
ints.erase(erase_it, ints.end());

{
    auto lock = my_important_int.lock();
    if(lock) std::cout << *lock << std::endl;
    else std::cout << "index 6000 expired." << std::endl;
}

ints.erase(ints.begin(), ints.end());

{
    auto lock = my_important_int.lock();
    if(lock) std::cout << *lock << std::endl;
    else std::cout << "index 6000 expired." << std::endl;
}

应该打印出:

6000
6000
index 6000 expired.

关于c++ - 更改为 vector 后如何维护指向 vector 元素的引用/指针/链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39001994/

相关文章:

c++ - 包括与用户定义的类名冲突的 Windows header

c - 结构段错误 : 11. 无法重新分配首先初始化为 null 的结构中的值

c++ - STL vector 是 realloc 的更好版本吗?

python - 使用 numpy 数组连接列向量

c++ - 是否有任何方法可用于更改 MFC(c++) 中 CListBox 的属性 "right align text"?

c++ - 从类调用函数时箭头 '->' 分隔符崩溃

c++ - 不能 push_back 到引用 vector 中

c - 将指针数组传递给 GTK 相关函数

C - 指针释放后不为空

java - 我怎样才能从主类(class)调用一个类(class)?