#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()
вместо этого, когда это необходимо.