大家好,我遇到了以下问题,我实现了一个图
int v= 26;
vector<int> adj[v];
并且在此邻接表中即时输入我的值
void add_edge_directed(vector<int> adj[], int src, int dest)
{
adj[src].push_back(dest);
}
这很好,但是我的问题是我的数组是静态值而不是动态值。所以我认为有一个vector>可以动态扩展,所以我尝试了
vector< vector<int> > adj;
并尝试使用其中的值
void add_edge_vec(vector<vector<int> >ads, int src, int dest)
{
adj[src].push_back(dest);
}
所以我没有构建错误,但是我的qtcreator在调试器模式下说:
下等人停止了,因为它从操作员那里收到了一个信号 系统信号名称:SIGSEGV信号含义:分段故障
调试器在915行的stl_vector.h中显示了错误
push_back(const value_type& __x)
{
if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
{
_Alloc_traits::construct(this->_M_impl, this->_M_impl._M_finish,
__x);
++this->_M_impl._M_finish;
}
所以我不知道我在做什么错。如果有人可以帮助我,那就太好了。
答案 0 :(得分:3)
vector<vector<int>> adj;
创建大小为adj
的向量0
,因此当您尝试从中访问值时:
void add_edge_directed(vector<int> adj[], int src, int dest)
{
// adj size = 0
// this will cause a seg fault since you are trying
// to access an element at index src which is outside
// of the vector
adj[src].push_back(dest);
}
对于向量数组,您正在初始化该数组以包含v
个元素:
vector<int> adj[v];
因此,对于矢量,您可以使用
vector<vector<int>> adj(v);
这将创建一个vector
,其中v
个向量的大小为0
。现在,您可以按以下方式重写add_edge_directed
:
// pass adj by reference (vector<vector<int>>&) to avoid creating
// a copy of adj each time the function is called
void add_edge_directed(vector<vector<int>>& adj, int src, int dest)
{
adj[src].push_back(dest);
}
答案 1 :(得分:0)
所以至少我想为这个问题发布完成的解决方案
int main()
{
vector<vector<uint32_t>> adj;
uint32_t segmentCount = 7;
vector<uint32_t> preset = {0,1, 1,2, 0,3, 4,5, 5,6};
createGraph(preset,adj,segmentCount);
}
现在我用添加向量
void createGraph(vector<uint32_t> preset ,vector<vector<uint32_t>> &adj,uint32_t segmentCount){
uint32_t k=1;
while (!preset.empty()){
uint32_t src = preset.front();
preset.erase(preset.begin());
uint32_t dest = preset.front();
preset.erase(preset.begin());
addEdgeDirected(adj,src,dest);
++k;
}
}
现在,我通过插入初始化器列表将向量推入其中。
void addEdgeDirected(vector<vector<uint32_t>> &adj, uint32_t src, uint32_t dest)
{
adj.emplace_back(std::initializer_list<uint32_t>{ });
adj.at(src).push_back(dest);
}
谢谢大家的帮助!