首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++向量插入访问冲突读取位置

问c++向量插入访问冲突读取位置
EN

Stack Overflow用户
提问于 2014-07-20 14:42:27
回答 1查看 1.2K关注 0票数 1

我的向量是这样构造的:

代码语言:javascript
复制
struct segment {
    float x1;
    float y1;
    float x2;
    float y2;
    float k;
    float b;
};

enum EventType {UPPER_PT = 0, LOWER_PT, INTER_PT};
struct order {
    float x;
    float y;
    vector<segment>::iterator line_id;
    vector<segment>::iterator line2_id;
    EventType type;
};

vector<segment> seg_lines;
vector<order> event_list;

初始化event_list之后,我尝试在一个随机位置上创建一个新元素,如下所示:

代码语言:javascript
复制
order new_event;
new_event.x = 300;
new_event.y = 400;
new_event.line_id = an_iterator_in_seg_lines;
new_event.line2_id = another_iterator_in_seg_lines;
new_event.type = INTER_PT;

bool inte_inserted = false;
for(vector<order>::iterator tmp_idx = event_list.begin(); tmp_idx != event_list.end(); tmp_idx++) {
    if(a_Y_threshold > tmp_idx->y || a_Y_threshold == tmp_idx->y && an_X_threshold < tmp_idx->x) {
        event_list.insert(tmp_idx, new_event);
        inte_inserted = true;
        break;
    }
}

我可以向你保证,line_id和line2_id都是有效的。我只是想简化我的描述。

在这种情况下,它试图在“第五位置”插入一个new_event,而event_list的大小和容量都是10,而event_list中充满了有效的order。

但我会犯这样的错误:

代码语言:javascript
复制
Unhandled exception in ... 0xC0000005: Access violation reading location 0x00000000

我认为错误代码告诉我我使用的指针无效。但是我检查了我的“观察”视图,所有与迭代器相关的(包括tmp_idx)都是有效的,并且指向正确的位置。

我尝试使用emplace()而不是insert(),它不起作用。在插入新元素之前,我尝试过resize()我的event_list,它也不起作用。但是,当我使用list来构造event_list而不是vector时,它就像一种魅力。

那么,是什么导致了这个问题,如果我想坚持使用vector,我应该做什么呢?

我用VS 2010。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-18 13:05:31

来自cplusplus

如果发生重新分配,所有与容器相关的迭代器、指针和引用都将失效。

在向量上循环插入时,可能会使迭代器失效。您可以将元素向后推到向量中,而不是插入它们,并且只在最后重新排序向量。更容易更干净。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24851572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档