2015-07-20 43 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; 
    
相關問題