You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Eclipse调试器中vector.size()执行push_back后未更新问题求助

解决Vector合并后目标容器Size未更新的问题

先看你的核心代码片段:

for (int j = 0; j < superpixels[orgIndex].size(); j++) { 
    superpixels[dstIndex].push_back(superpixels[orgIndex][j]); 
} 
superpixels[orgIndex].clear(); 
std::vector<int>().swap(superpixels[orgIndex]); 

你说执行push_back后Eclipse调试器显示superpixels[dstIndex].size()没变化,结合初始情况orgIndex=1、dstIndex=287,我整理了几个最可能的排查方向:

  • 目标容器的索引是否合法?
    先确认superpixels这个容器的大小是否至少是288(因为索引从0开始,287是第288个元素)。如果superpixels的size小于等于287,那superpixels[dstIndex]会触发未定义行为——你可能在访问一个不存在的vector,此时push_back的操作根本不会作用到你期望的容器上,甚至可能破坏内存导致调试器显示异常。

  • 调试器的显示是否有延迟?
    Eclipse的调试器有时候会因为缓存或者优化问题,没有实时更新容器的size值。你可以在push_back循环结束后,手动添加一行代码打印superpixels[dstIndex].size():

    std::cout << "dst size after push: " << superpixels[dstIndex].size() << std::endl;
    

    对比调试器的显示和控制台输出,判断是不是调试器的显示问题。

  • 源容器的初始size是否为0?
    你提到执行前的初始情况,但没明确说superpixels[1].size()具体是多少。如果superpixels[1]本身就是空的,那循环根本不会执行,dstIndex对应的vector自然不会有变化。可以在循环前打印superpixels[orgIndex].size()确认这点。

  • 是否存在多线程竞争?
    如果这段代码是在多线程环境下执行的,可能有其他线程同时修改superpixels[dstIndex],或者修改了superpixels的结构(比如删除元素),导致你的push_back操作被覆盖或者失效。

另外,给你提个代码优化建议:合并vector不需要手动写循环,直接用insert效率更高:

superpixels[dstIndex].insert(superpixels[dstIndex].end(), 
                             superpixels[orgIndex].begin(), 
                             superpixels[orgIndex].end());
superpixels[orgIndex].clear();
std::vector<int>().swap(superpixels[orgIndex]);

insert是STL内置的批量插入方法,比手动循环push_back更高效,也能减少手动循环可能出现的错误。

内容的提问来源于stack exchange,提问作者frozenca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:05:03