push_back操作使得C++引用失效


//vector<Node> nodes;
Node& my_ref = nodes[i];
nodes.push_back(Node());
//此时my_ref有可能不再指向之前的nodes[i]了!!!
这是因为在push_back的时候,nodes的内存可能会因为capacity不够而进行重新分配,以至于以前的引用失效。

由此可见,引用的实现也是跟地址(指针)类似的,如果地址改变,引用就会失效。

转载于:https://my.oschina.net/superpdm/blog/394616

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码的主要问题在于访问 potential_tracksv 和 visited_detections 容器时使用了循环,这样会导致在容器较大时的性能问题。另外,在每次迭代都要执行 potential_tracks.erase(current_track) 操作,也会对性能造成一定的影响。 为了优化这段代码,可以采用迭代器来遍历容器,避免使用循环。另外,可以使用 erase 函数的返回值来删除元素,避免每次都要执行 erase 操作。具体的优化代码如下: ```c++ while (!potential_tracks.empty()) { int current_track = *potential_tracks.rbegin(); potential_tracks.erase(--potential_tracks.end()); visited_tracks.insert(current_track); for (int j = 0; j < cost_matrix.rows; ++j) { if (cost_matrix.at<int>(j, current_track) == 1) { setupdate(visited_detections, j); } } for (auto it = visited_detections.begin(); it != visited_detections.end(); ) { std::vector<int> connected_tracks; for (int j = 1; j < cost_matrix.cols; ++j) { if (cost_matrix.at<int>(*it, j) == 1) { connected_tracks.push_back(j); } } for (auto tr : connected_tracks) { if (visited_tracks.count(tr) || potential_tracks.count(tr)) { continue; } it = visited_detections.erase(it); potential_tracks.insert(tr); } ++it; } } ``` 在优化后的代码,采用了迭代器来遍历 visited_detections 容器,避免了使用循环。同时,在 visited_detections.erase(it) 操作后,使用了迭代器的后置递增运算符,避免了迭代器失效的问题。此外,使用了 potential_tracks.rbegin() 和 --potential_tracks.end() 来获取 potential_tracks 容器的最后一个元素,避免了使用 vector 容器的 pop_back 操作。最后,将 visited_tracks.insert(current_track) 的操作提到了 potential_tracks.erase(current_track) 的前面,避免了重复插入已经访问过的轨迹。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值