如何将指针添加到指向向量的指针中

时间:2018-11-05 19:14:30

标签: c++ pointers dynamic-memory-allocation

我有这个:

    std::vector<Pair *> *artistAttributes;

Pair是一个类,如何向该指针添加元素?

如果是std::vector,我知道如何访问它,

std::vector<Pair *> artistAttributes; 

但是我不熟悉如何向其中添加元素,因为我对指针非常陌生。

3 个答案:

答案 0 :(得分:1)

  

我非常了解指针。

仅指向自动存储(“堆栈”)上的对象的指针与指向自由存储(“堆”)上的对象的指针之间存在语义差异,因为指向堆上的对象的指针必须在某种程度上点用于释放(delete / delete[])先前分配有new(或new[])的内存。

这不仅容易忘记,而且在分配和释放之间抛出异常时也无法做到这一点。为了简化操作,发明了RAII/RDID惯用语(“资源获取是初始化/资源破坏是删除”)之后的智能指针:原始指针封装在对象中,这些对象管理它们处理的资源的生存期。 / p>

这使得在许多情况下可以避免遵循Rule of 3/5(在现代C ++中更像是Rule of the Big Four (and a half)),而改用Rule of Zero

此外,由于矢量的复制成本低(与必须管理动态分配的内存带来的不便相比),指向std::vector<>的指针毫无意义。

所以不是

std::vector<Pair *> *artistAttributes;

更好地使用

std::vector<std::shared_ptr<Pair>> artistAttributes;

答案 1 :(得分:0)

看到这个:

std::vector<Pair*> *artistAttributes;
artistAttributes = new std::vector<Pair*>;
artistAttributes->push_back(new Pair())
...
for(int i=0; i<artistAttributes->size(); i++)
   delete (*artistAttributes)[i] // Don't forget
delete artistAttributes; // Don't forget

相比:

std::vector<Pair*> artistAttributes;
//artistAttributes = new std::vector<Pair*>; // no needed
artistAttributes.push_back(new Pair()) // use . instead of ->
...
for(int i=0; i<artistAttributes.size(); i++)
   delete artistAttributes[i] // Don't forget

与以下内容相比:

std::vector<Pair> artistAttributes;
//artistAttributes = new std::vector<Pair*>; // no needed
artistAttributes.push_back(Pair())

答案 2 :(得分:0)

通常,您使用.运算符访问对象的成员。如果要访问指向对象的指针的成员,请使用->运算符。

因此,您可以使用artistAttributes->push_back()(添加新元素)或artistAttributes->at()(修改现有元素)来修改向量。同样,您也可以执行(*artistAttributes).push_back()(*artistAttributes).at()