1

push_back を使用してベクターに int を挿入すると、答えが 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的にベクトルのサイズが 1 増加します。

オブジェクトを受け入れるコンストラクター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

2 つ目では、特定のサイズのベクトルを作成しています。次に、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 に答える