对指针数组使用begin()、end()

Use of begin(), end() for Pointer Array

本文关键字:end begin 指针 数组      更新时间:2023-10-16

我有下面的代码

PositionSummary** psArray_= new PositionSummary*[instSize]
for (int k = 0; k < instSize_; k++)
{
    PositionSummary* ps = new PositionSummary();
    psArray_[k] = ps;
}

当我尝试按照下面的方式复制时,不起作用

std::copy(begin(psArray_),end(psArray_),std::back_inserter(psContainer_));

编译器报告"调用'begin(PositionSummary*&)没有匹配的函数",如何解决这一问题?

这不起作用,因为psArray_根本不是数组,而是指针您可能知道它指向特定大小的数组,但编译器没有(通用)方法来知道这一点。如果你把它做成一个数组,它会很好用。尝试这样声明psArray_:
PositionSummary* psArray_ [instSize];

这会起作用,但可能不适合您,因为我猜instSize不是编译时常数。你可以通过使用向量而不是自己分配内存来解决这个问题:

std::vector<PositionSummary*> psArray_;
for (int k = 0; k < instSize; k++) 
    psArray_.push_back (new PositionSummary());
std::copy(psArray_.begin()),psArray_.end(),std::back_inserter(psContainer_));

为了进一步改进,可以考虑在矢量中使用智能指针(这样以后就不必担心释放)。虽然我不知道你的代码的更大上下文,但我仍然想知道为什么副本是必要的——为什么不直接在最终应该保存它的数据结构中构建你的向量呢?

psArray只是一个指针。std::beginstd::end不可能知道指针指向的数组的长度。它们适用于普通数组,而不适用于指向数组的指针。

你可以这样做:

std::copy(psArray_, psArray_ + instSize, std::back_inserter(psContainer_));

假设CCD_ 4是容纳指向CCD_ 5的指针的容器。

根据应用程序的详细信息,您最好使用std::vector,无论是智能指针还是值:

std::vector<some_smart_pointer<PositionSummary>> psArray_;

std::vector<PositionSummary> psArray_;

如果不需要引用语义,第二个选项可能是更好的。