我有以下代码
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;,如何解决这个问题?
答案 0 :(得分:1)
psArray
只是一个指针。 std::begin
和std::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_));
为了进一步改进,您可以考虑在向量中使用智能指针(因此您不必担心以后会释放)。虽然我不知道你的代码的更大的上下文,但我仍然想知道为什么副本是必要的 - 为什么不直接在最终应该保存它的数据结构中构造你的向量?