C Удаление объектов в векторе и замена их новыми объектами

#c #vector

#c #вектор

Вопрос:

Я хочу удалить объекты внутри вектора и заменить их новыми объектами в моем проекте SFML C . Когда я запускаю программу, старые объекты исчезают, и на их месте ничего не появляется. Вот функция createObjects:

 vector<Object> createObjects(float numberOfObjects) {
    vector<Object> v;
    v.push_back(Object());  
return v;
}
  

И вот код внутри while(window.pollEvent(событие)) в main.cpp:

 if ((event.type == Event::KeyPressed) amp;amp; (event.key.code == Keyboard::Hyphen)) {
    numberOfObjects--;
    v.clear();
    vector<Object> v = createObjects(numberOfObjects);
}

if ((event.type == Event::KeyPressed) amp;amp; (event.key.code == Keyboard::Equal)) {
    numberOfObjects  ;
    v.clear();
    vector<Objectk> v = createObjects(numberOfObjects);
}
  

Комментарии:

1. vector<Objectk> v = createObjects(numberOfObjects); — Вы не используете параметр numberOfObjects внутри createObjects, тогда зачем он вам?

2. float numberOfObjects Я не думаю, что вы хотели бы, чтобы это было, float если вы действительно используете параметр, и это numberOfObjects подходящее название. Не похоже, что вы можете создавать объекты 3.1.

Ответ №1:

Вы вообще не заменяете оригинал vector , вы присваиваете выходные данные createObjects() локальному vector файлу, который немедленно выходит из области видимости. Вам нужно избавиться от локальной v переменной, которой вы присваиваете, изменив это:

 vector<Objectk> v = createObjects(numberOfObjects);
  

К этому:

 v = createObjects(numberOfObjects);
  

Вот так:

 if ((event.type == Event::KeyPressed) amp;amp; (event.key.code == Keyboard::Hyphen)) {
    numberOfObjects--;
    v.clear();
    v = createObjects(numberOfObjects); // <-- HERE
}

if ((event.type == Event::KeyPressed) amp;amp; (event.key.code == Keyboard::Equal)) {
    numberOfObjects  ;
    v.clear();
    v = createObjects(numberOfObjects); // <-- HERE
}
  

При этом нет необходимости вызывать clear() перед вызовом createObjects() , a vector автоматически очищает свои старые данные при назначении новых данных, например:

 if ((event.type == Event::KeyPressed) amp;amp; (event.key.code == Keyboard::Hyphen)) {
    numberOfObjects--;
    v = createObjects(numberOfObjects); // <-- HERE
}

if ((event.type == Event::KeyPressed) amp;amp; (event.key.code == Keyboard::Equal)) {
    numberOfObjects  ;
    v = createObjects(numberOfObjects); // <-- HERE
}
  

Еще лучше то, что vector вообще нет необходимости воссоздавать, например:

 if ((event.type == Event::KeyPressed) amp;amp; (event.key.code == Keyboard::Hyphen)) {
    if (!v.empty()) {
        // to remove an element from the end...
        v.pop_back();
        // or, to remove an element from the front...
        v.erase(v.begin());
        numberOfObjects--;
    }
}

if ((event.type == Event::KeyPressed) amp;amp; (event.key.code == Keyboard::Equal)) {
    // to add an element at the end...
    v.push_back(Object());
    // or, to add an element at the front...
    v.insert(v.begin(), Object());
    numberOfObjects  ;
}
  

В этом случае вы могли бы просто numberOfObjects полностью избавиться от них и использовать v.size() вместо этого, когда это необходимо.