gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:36:20 24 4
gpt4 key购买 nike

我有一个自定义类的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com