1

我注意到,如果我使用 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;
}

----对----

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);  
4

5 回答 5

4

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方法预先分配内存,这就是我假设您正在尝试做的事情。

于 2013-08-18T18:01:54.397 回答
3

在第二个中,您正在创建一定大小的向量。然后,您正在使用 push_back。这是将值插入到向量的末尾。向量键以大小 3 开始,然后当您执行 3 次 push_back 调用时,向量将有 6 个元素。

不要将向量初始化为具有起始大小。对于向量键,请执行以下操作:

vector<int> keys;

然后你可以使用

keys.push_back(5);

将数据插入向量中。

于 2013-08-18T17:59:11.007 回答
3

push_back()元素插入容器。要获得与在构造函数中设置大小然后将构造初始向量所需的值设置为空相同的结果,例如:

std::vector<int> redDoors;
于 2013-08-18T17:59:39.767 回答
1

Push_back 在向量的末尾插入一个元素。但如果向量已满,它会分配容量增加的新内存并将向量复制到新内存。但是您正在创建具有初始大小的向量。您需要在没有这些初始大小的情况下创建它们,如下所示

std::vector<int> foo;
于 2013-08-18T17:57:31.890 回答
1

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

constructor类型的用 Texplicit vector( size_type count ); 的计数值初始化(默认构造,对于类)实例构造容器。不制作副本。

所以当你这样做时:

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[],只需执行以下操作:

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 ]
于 2013-08-18T18:10:25.277 回答