我有这个:
std::vector<Pair *> *artistAttributes;
Pair
是一个类,如何向该指针添加元素?
如果是std::vector
,我知道如何访问它,
std::vector<Pair *> artistAttributes;
但是我不熟悉如何向其中添加元素,因为我对指针非常陌生。
答案 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()
。