c++ 删除QVector中的指针元素而不减少向量大小

mutmk8jj  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(148)

我有一个20大小的QVector填充nullptr的,我想改变一些nullptr的对象,当我完成时,我想delete他们,但不减少矢量的大小。
下面是我尝试的一个例子:

#include <QVector>
#include <QDebug>

int main()
{
    //I declare a QVector, sized 20 and filled with nullptr's
    QVector<int*> exVector(20, nullptr);

    //outs 20
    qDebug() << exVector.size();

    int* num1 = new int(4);
    exVector[2] = num1;

    int* numToDel = exVector.takeAt(2);
    exVector[2] = nullptr;
    delete numToDel;

    //outs 19
    qDebug() << exVector.size();
}

字符串
如何删除第二个索引处的元素,而不移动向量中的元素并减小其大小?
编辑:这个例子中的问题是@Someprogrammerdude提到的takeAt函数。

4nkexdtk

4nkexdtk1#

当你想在用一个新值替换一个值后对它进行操作时,std::exchange()是要使用的函数:

delete std::exchange(exVector[2], nullptr);

字符串
如果你能够改变exVector的类型,你可以让它保存智能指针。然后我们通过分配一个null指针来删除:

QVector<std::unique_ptr<int>> exVector;  // or QSharedPointer<int>, etc. …
⋮
exVector[2] = nullptr;

ztigrdn8

ztigrdn82#

一种方法是使用std::swap

int *numToDel = nullptr;
std::swap(numToDel, exVector[2]);
delete numToDel;

字符串
这可以防止您忘记重置exVector[2]的问题。

whhtz7ly

whhtz7ly3#

takeAt函数

移除位于索引位置i的元素并传回它。

[我强调]
因此,takeAt函数删除该元素,减小向量的大小。“
如果您只想获取特定索引处的元素,请使用普通的[](如exVector[2])或使用at函数(如exVector.at(2))。
Botje's swap solution可能是最好的。

xxb16uws

xxb16uws4#

使用optional

std::vector<std::optional<int>> vec { 1, 2, 3, 4 };

// ...

vec[2] = std::nullopt;

字符串

相关问题