如何解决C ++删除vector中的对象并用新对象替换它们
我想删除向量中的对象,并用SFML C ++项目中的新对象替换它们。当我运行该程序时,旧对象消失并且它们的位置没有任何显示。 这是createObjects函数:
vector<Object> createObjects(float numberOfObjects) {
vector<Object> v;
v.push_back(Object());
return v;
}
这是main.cpp中while(window.pollEvent(event))中的代码:
if ((event.type == Event::KeyPressed) && (event.key.code == Keyboard::Hyphen)) {
numberOfObjects--;
v.clear();
vector<Object> v = createObjects(numberOfObjects);
}
if ((event.type == Event::KeyPressed) && (event.key.code == Keyboard::Equal)) {
numberOfObjects++;
v.clear();
vector<Objectk> v = createObjects(numberOfObjects);
}
解决方法
您根本不会替换原始的vector
,而是将createObjects()
的输出分配给立即超出范围的本地vector
。您需要通过更改以下内容来摆脱分配给其的本地v
变量:
vector<Objectk> v = createObjects(numberOfObjects);
对此:
v = createObjects(numberOfObjects);
赞:
if ((event.type == Event::KeyPressed) && (event.key.code == Keyboard::Hyphen)) {
numberOfObjects--;
v.clear();
v = createObjects(numberOfObjects); // <-- HERE
}
if ((event.type == Event::KeyPressed) && (event.key.code == Keyboard::Equal)) {
numberOfObjects++;
v.clear();
v = createObjects(numberOfObjects); // <-- HERE
}
话虽如此,在调用clear()
之前无需先调用createObjects()
,vector
在被分配新数据时会自动清除其旧数据,例如:
if ((event.type == Event::KeyPressed) && (event.key.code == Keyboard::Hyphen)) {
numberOfObjects--;
v = createObjects(numberOfObjects); // <-- HERE
}
if ((event.type == Event::KeyPressed) && (event.key.code == Keyboard::Equal)) {
numberOfObjects++;
v = createObjects(numberOfObjects); // <-- HERE
}
更好的是,根本不需要重新创建vector
,例如:
if ((event.type == Event::KeyPressed) && (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) && (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()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。