执行 push_back 后,集合的 C++ 向量给出分段错误

Posted

技术标签:

【中文标题】执行 push_back 后,集合的 C++ 向量给出分段错误【英文标题】:C++ vector of set gives segmentation fault after performing push_back 【发布时间】:2012-03-23 07:35:24 【问题描述】:

我在我的程序中创建了一个集合向量,我需要遍历每个集合。如果在集合中找到特定元素,我需要向向量添加一个新集合。但是,一旦我的数组的计数器到达我稍后插入的元素(在循环内),这就会给我一个分段错误。在下面的代码中,打开 list.push_back(cS) 会给我一个分段错误。

int main(void)  
set<int> cS;
vector<set<int> > list;

cS.insert(1);
list.push_back(cS);

cS.insert(2);
list.push_back(cS);

for (int ctr = 0; ctr < list.size(); ctr++)

    for (set<int>::iterator itr = list[ctr].begin(); itr != list[ctr].end(); itr++)
    
        if (*itr == 1 || *itr == 2)
        
            cS.clear();
            cS.insert(3);
            //list.push_back(cS);
        
    


for (int ctr = 0; ctr < list.size(); ctr++)

    for (set<int>::iterator itr = list[ctr].begin(); itr != list[ctr].end(); itr++)
    
        cout << *itr << endl;
    


return 0;

如果有人能解释为什么会出现错误(在 gcc 中),我将不胜感激。

感谢您浏览我的帖子。

【问题讨论】:

只是出于好奇,您为什么对集合使用迭代器而不对向量使用迭代器? 我猜是出于习惯。据我所知,对于向量,使用迭代器或索引是等价的。 【参考方案1】:

当你push_back 进入你的向量时,你会在向量需要分配更多内存的情况下使所有对其中元素的引用无效。在您的情况下,迭代器 itrpush_back 之后变得无效。一种解决方案是将集合添加到单独的列表(向量)中,然后在 for 循环之后一次全部追加:

vector<set<int> > add;
for (int ctr = 0; ctr < list.size(); ctr++)

    for (set<int>::iterator itr = list[ctr].begin(); itr != list[ctr].end(); itr++)
    
        if (*itr == 1 || *itr == 2)
        
            cS.clear();
            cS.insert(3);
            add.push_back(cS);
        
    

list.insert(list.end(), add.begin(), add.end());

【讨论】:

在那种情况下,有没有办法遍历向量的每个元素,而在特殊情况下插入一些元素呢? push_back 不会必然使迭代器无效,某些对push_back 的调用可能会无效。 @user571376:使用基于索引的迭代。 FAQ 帖子中介绍了此处的确切规则:***.com/questions/6438086/iterator-invalidation-rules @Nawaz 正确,但编码的唯一方法是假设它确实如此。

以上是关于执行 push_back 后,集合的 C++ 向量给出分段错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能在 2D 向量中 push_back? C++

为啥我无法将对象 push_back 放入 C++ 多维向量中

将“push_back”用于带有“get”函数C++的向量

指针定义后 C++ vector.push_back 崩溃

与在 C++ 中使用 push_back 相比,声明具有大小的向量是不是提供了任何改进

对 Vector 元素的 push_back 操作 (C++)