簡體   English   中英

使用push_back的C ++向量

[英]c++ vector using push_back

我注意到,如果我使用push_back在向量中插入整數,則得到的答案是1,但是如果我通過vector [0]將整數插入到向量中,則會得到正確的答案。 我的問題是,push_back會做更多的事情,然后將我的整數插入向量中嗎?

#include<vector>
#include<iostream>
using namespace std;

typedef vector<int> vi;

class KeyDungeonDiv2 {
public:

    int countDoors(vi doorR, vi doorG, vi keys)
    {
        int r = keys[0];
        int g = keys[1];
        int w = keys[2];
        int numdoors = 0;

        for(int i = 0; i < doorR.size(); i++) {
            if(r >= doorR[i] && g >= doorG[i])
                numdoors++;
            else if (r < doorR[i] && g >= doorG[i]) {
                if(r + w >= doorR[i]) {
                    numdoors++;
                }
            }
            else if(r >= doorR[i] && g < doorG[i]) {
                if(g + w >= doorG[i]) {
                    numdoors++;
                }
            }
            else if (r < doorR[i] && g < doorG[i]) {
                if(w >= (doorR[i] - r ) + (doorG[i] - g)) {
                    numdoors++;
                }
            }
            else if(doorR[i] == 0 && doorG[i] == 0)
                    numdoors++;
        }
        return numdoors;
    }
};

int main()
{
    vector<int> redDoors (4);
    redDoors[0] = 2;
    redDoors[1] = 0;
    redDoors[2] = 5;
    redDoors[3] = 3;

    vector<int> greenDoors(4);
    greenDoors[0] = 1;
    greenDoors[1] = 4;  
    greenDoors[2] = 0;  
    greenDoors[3] = 2;  

    vector<int> keys (3);
    keys[0] = 2;    
    keys[1] = 3;    
    keys[2] = 1;    

    KeyDungeonDiv2 d;
    cout << d.countDoors(redDoors,greenDoors,keys) << endl;

    return 0;
}

---- vs .----

vector<int> redDoors (4);
redDoors.push_back(2);
redDoors.push_back(0);
redDoors.push_back(5);
redDoors.push_back(3);

vector<int> greenDoors(4);
greenDoors.push_back(1);
greenDoors.push_back(4);    
greenDoors.push_back(0);    
greenDoors.push_back(2);    

vector<int> keys (3);
keys.push_back;
keys.push_back(3);  
keys.push_back(1);  

vector<int>::push_back方法將始終添加到向量中,因此,當您使用push_back方法時,實際上是將向量的大小增加了一個。

接受size_t對象的構造函數正在設置向量的初始大小,但使用默認構造的對象填充該向量。

因此,您正在執行的操作是:

vector<int> redDoors(4);
// redDoors = [ 0 | 0 | 0 | 0 ]

redDoors.push_back(2);
// redDoors = [ 0 | 0 | 0 | 0 | 2 ]


redDoors.push_back(0);
// redDoors = [ 0 | 0 | 0 | 0 | 2 | 0 ]

// ... and so on...

您只需要對向量使用默認構造函數即可。 例如

vector<int> redDoors;

而且,如果您需要優化,則可以使用reserve方法來預分配內存,這是我假設您正在嘗試做的事情。

在第二個中,您將創建一定大小的向量。 然后,您正在使用push_back。 這是將值插入向量的末尾。 向量鍵從大小3開始,然后當您進行3次push_back調用時,向量將包含6個元素。

不要將向量初始化為具有起始大小。 對於矢量鍵,請執行以下操作:

vector<int> keys;

然后,您可以使用

keys.push_back(5);

將數據插入向量。

push_back()將元素插入容器。 為了獲得與在構造函數中設置大小然后設置值相同的結果,您需要將初始向量構造為空,例如:

std::vector<int> redDoors;

Push_back在向量的末尾插入一個元素。 但是,如果向量已滿,它將分配容量增加的新內存,並將向量復制到新內存。 但是,您正在創建具有初始大小的向量。 您需要創建時沒有以下初始尺寸,如下所示

std::vector<int> foo;

push_back方法將給定的元素值附加到容器的末尾。

類型explicit vector( size_type count );constructor explicit vector( size_type count ); 使用T的計數值初始化 (對於類為默認構造)實例構造容器 。不進行任何復制。

因此,當您這樣做時:

vector<int> redDoors (4); // Create a vector of 4 ints initialized at 0
redDoors.push_back(2);    // Adds 2 at the end
redDoors.push_back(0);    // Adds 0 at the end
redDoors.push_back(5);    // Adds 5 at the end
redDoors.push_back(3);    // Adds 3 at the end

// Result :
// [ 0, 0, 0, 0, 2, 0, 5, 3 ]

如果您希望獲得與使用operator[]訪問向量時相同的行為,請執行以下operator[]

vector<int> redDoors;     // Just create a vector
redDoors.push_back(2);    // Adds 2 at the end
redDoors.push_back(0);    // Adds 0 at the end
redDoors.push_back(5);    // Adds 5 at the end
redDoors.push_back(3);    // Adds 3 at the end

// Result :
// [ 2, 0, 5, 3 ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM