首页 > 解决方案 > C ++删除向量中的对象并用新对象替换它们

问题描述

我想删除向量内的对象并用我的 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);
}

标签: c++vector

解决方案


您根本没有替换原始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(),avector在分配新数据时会自动清除其旧数据,例如:

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++;
}

在这种情况下,您可以完全摆脱numberOfObjectsv.size()在需要时使用。


推荐阅读