2015-07-20 181 views
0

所以,我有以下情况:如何检查一个向量是否在C++中的2d向量中指向空向量?

我宣布整数向量的向量为vector < vector<int> > edges。基本上,我试图使用其中图被定义如下上述实施的曲线图:

class graph 
{ 
    public: 
    int vertices; 
    vector < vector<int> > edges; 
}; 

现在,一个边缘的插入过程中,我采取输入作为起始顶点和结束顶点。现在,我想要做这样的事情:

void insert(int a, int b, graph *mygraph) // a is starting vertex and b is ending vertex 
{ 
    auto it = mygraph->edges.begin(); 
    //int v = 1; 
    vector<int> foo; 
    foo.push_back(b); 
    if (mygraph->edges[a].size() != 0) // Question here? 
     mygraph->edges[a].push_back(b); 
    else 
     mygraph->edges.push_back(foo); 

    return; 
} 

现在,在标有Question here行了,基本上,我想检查是否为特定条目的载体存在与否? size实际上是错误的,因为我试图在不存在的向量上调用大小操作。换句话说,我想检查一下,如果有矢量存在于矢量矢量中的特定位置。我该怎么做?例如,mygraph->edges[a] != NULL

+3

它会存在当且仅当'一< mygraph-> edges.size()'。 – molbdnilo

回答

2

只需检查a不超过矢量的大小。如果是,则调整外部矢量的大小。

void insert(int a, int b, graph &mygraph) { // a is starting vertex and b is ending vertex 
    if (a >= mygraph.edges.size()) 
     mygraph.edges.resize(a+1); 
    mygraph.edges[a].push_back(b); 
} 
0

边缘是矢量的矢量。矢量在内存中连续存储。您从最后插入元素到一个向量中。如果矢量大小为10,则所有10个成员都是连续的,它们的索引将在0-9范围内。如果删除一个中间矢量,比如说第5个,那么索引6-9中的所有矢量都会向上移动1.

说了这么一句话,就是你不能有这样一种情况,即边不会有索引没有一个载体。要回答你的问题,如果

a < mygraph-> edges.size();

1

您可以用两种不同的方式接近你的问题:

  1. 初始化edges到顶点的数量,并且不允许以后要插入其他顶点。这是为什么?

    std::vector< std::vector<int> > v = { {1}, {2} }; 
    // now you need to add an edge between vertex 4 and vertex 5 
    std::vector<int> edges3; 
    v.push_back(edges3); // v = { {1}, {2}, {} } 
    std::vector<int> edges4 = {5}; 
    v.push_back(edges4); // v = { {1}, {2}, {}, {5} } 
    

    如果你不想那样做,你必须做这样的事情第一:

    std::vector< std::vector<int> > v; 
    for (int i = 0; i < maxVertices; i++) 
    { 
        std::vector<int> w; 
        v.push_back(w); 
    } 
    // now you need to add an edge between vertex 4 and vertex 5 
    v[4].push_back(5); 
    
  2. 更改用于edges结构,可能是更适合的东西对于稀疏矩阵(在这里看起来像你的情况,因为可能不是每个顶点都连接到每个其他顶点)。尝试:

    std::map< int, std::vector<int> > edges; 
    

    这样,你可以搭配其它顶点列表的一个顶点,而无需初始化edges到顶点的最大可能数。

    std::vector<int> vertices = {5}; 
    edges[4] = vertices; 
    
相关问题