在vector << vector> int>中推int

时间:2018-07-08 20:52:20

标签: c++ vector

大家好,我遇到了以下问题,我实现了一个图

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;
  }

所以我不知道我在做什么错。如果有人可以帮助我,那就太好了。

2 个答案:

答案 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);
}

谢谢大家的帮助!