vector<pair<int,unordered_set<int>>> 在为对提供默认构造函数参数时给出分段错误
vector<pair<int, unordered_set<int>>> gives segmentation fault when supplying default constructor argument for pair
** 编辑:默认构造函数不会导致问题。我在下面陈述了原因。我已经标记并投票结束了这个问题,为任何有机会看到这篇文章的人道歉。**
不起作用的代码
int n = numCourses;
vector<pair<int, unordered_set<int>>> graph(n, make_pair(0, unordered_set<int>())); // pair of how many edges go in, and set of its neighbors.
// We have to find our leaves:
bool leaf[n];
for(int i = 0; i < n; i++){
leaf[i] = true;
}
for(auto p : prerequisites){
graph[p.first].first++;
graph[p.first].second.insert(0);
leaf[p.second] = false;
}
vector<int> leaves;
for(int i = 0; i < n; i++){
if(leaf[i])
leaves.push_back(i);
}
我正在尝试构建一个具有一些不错属性的 DAG 图。我想在图形中提供一个默认的构造函数参数,使用 make_pair 将右值定义提供给图形的第二个参数。第一个参数是向量的大小。我想传递一个右值,其中货币对的第一个值为 0,所以当我递增 graph[p.first].first++
时,我确定它是 0。
我试过这个,当它到达graph[p.first].second.insert(0)
时,它会抛出一个段错误,但我不是 100% 确定为什么会发生这种情况。
有效的代码
int n = numCourses;
vector<pair<int, unordered_set<int>>> graph(n); // NO MORE DEFAULT RVALUE
// We have to find our leaves:
bool leaf[n];
for(int i = 0; i < n; i++){
leaf[i] = true;
}
for(auto p : prerequisites){
graph[p.first].first++;
graph[p.first].second.insert(0);
leaf[p.second] = false;
}
vector<int> leaves;
for(int i = 0; i < n; i++){
if(leaf[i])
leaves.push_back(i); // This causes a segfault if I don't change it.
}
所以这个问题实际上在graph[p.first].second.insert(0)
之后就上线了.是我的布尔数组导致了问题。很抱歉造成混乱!我已将这篇文章标记为被模组删除。
谢谢!
编辑:下面我添加了一些可运行的案例:不会导致段错误:https://ideone.com/EdmSva确实会导致段错误:https://ideone.com/GHQfog
这是由于布尔数组越界访问。我应该接受这一点,但我试图使用一些打印语句来查看段错误发生的位置。它在之后的行上,我猜当段错误发生时,stdout 的缓冲区没有被刷新,所以对于之前的行,它也没有显示打印。我不会再使用打印来二进制搜索我的错误以查找段错误 - 在这里学到了一个宝贵的教训。
是的,您错过了一些东西 - 段错误与graph
的初始化无关,它完全按照人们的预期工作。要查看的简单示例:
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int main() {
// your code goes here
int n = 5;
vector<pair<int, unordered_set<int>>> graph(n, make_pair(0, unordered_set<int>()));
graph[0].first = 1;
graph[1].second.insert(5);
graph[1].second.insert(6);
for (auto&& p : graph) {
std::cout << p.first << " " << p.second.size() << std::endl;
}
return 0;
}
输出(或在此处运行:https://ideone.com/kSVSnA(:
1 0
0 2
0 0
0 0
0 0
代码中的某些未定义行为和省略位中存在其他错误:)
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中