2013-08-18 4 views
1

Я заметил, что если я использую push_back для вставки ints в вектор, я получаю ответ на 1, но если я вставляю целые числа в свой вектор по вектору [0], я получаю правильный ответ. Мой вопрос заключается в том, что push_back делает больше, чем просто вставляя мое целое число в вектор?C++ vector using 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

Метод 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 предварительно выделить память, которая является то, что я предполагаю, что вы пытаетесь сделать.

+0

Так что, если мне нужно найти «, что Я добавил последний раз ", я просто проверяю redDoors [(redDoors.size() - 1)], если он был создан пустым? –

+0

@huseyintugrulbuyukisik - Предполагая, что вы использовали метод push_back для добавления элемента в вектор, вы можете делать то, что вы предложили. Просто убедитесь, что ваш вектор не пуст первым ;-) –

1

push_back вставляет элемент в конец вектора. Но если вектор заполнен, он выделяет новую память с увеличенной емкостью и копирует вектор в новую память. Но вы создаете свои векторы с начальными размерами. Вам необходимо создать их без этих начальных размеров, как показано ниже:

std::vector<int> foo; 
3

Во втором вы создаете векторы определенного размера. Затем вы используете push_back. Это вставляет значение в конец вектора. Векторные клавиши начинаются с размера 3, затем, когда вы выполняете 3 вызова push_back, вектор будет иметь 6 элементов.

Не инициализируйте векторы, чтобы иметь начальный размер. Для вектора ключи это сделать:

vector<int> keys; 

Вы можете использовать

keys.push_back(5); 

для вставки данных в вектор.

3

push_back() Вставить элементы в контейнер. Для того, чтобы получить тот же результат, установив размер в конструкторе и затем установить значение, которое нужно построить начальные векторы как пустые, например:

std::vector<int> redDoors; 
1

Метод push_backдобавляет значение данного элемента в конец контейнера.

constructor типа explicit 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 ]