使用begin(),end()作为指针数组

时间:2015-02-15 07:43:23

标签: c++

我有以下代码

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_));

编译器报告&#34;没有匹配函数来调用'begin(PositionSummary *&amp;)&#34;,如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

您可以这样做:

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

假设psContainer_是一个容器,指向PositionSummary

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

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

std::vector<PositionSummary> psArray_;

如果您不需要参考语义,那么第二个选项可能更好。

答案 1 :(得分:1)

这不起作用,因为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_));

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