基本的に、以下の説明を理解するには、自動格納オブジェクトと自由格納オブジェクトの違いとその有効期間を理解する必要があります。
オブジェクトからオブジェクトへ
std::copy(book, book + 10, tempBook);
// if you compiler supports C++11, then
// std::copy(std::cbegin(book), std::cend(book), std::begin(tempBook));
book
これにより、s のすべての内容がs にコピーされますtempBook
。
オブジェクトへのポインタ
一連のポインターが本を指すようにする場合は、オブジェクトとしてではなく、データ型tempBook
のポインターとして宣言する必要があります。Record
Record books[10];
// later
Record *tempBooks[10];
for(int i = 0; i < 10; ++i)
{
tempBooks[i] = &books[i];
}
ポインターへのポインター
スタックに 10 本の本を作成し、それらを (スタック内の) 別の配列にコピーする場合は、上記のように使用できますstd::copy
。(新規/削除を使用して) フリー ストアにオブジェクトを作成する場合は、それらを作成し、任意の数のポインターがそれらの無名オブジェクトを指すようにします。
Record *books = new Record[10];
// later
Record *tempBooks = books;
スマートポインター
ただし、メモリ処理を改善し、メモリ リークを回避するために、C++11 が提供するスマート ポインターを使用することをお勧めします。共有ポインタを使用します。
#include <memory>
std::shared_ptr<Record> spBooks[10];
spBooks[0] = make_shared<Record>(/*pass constructor arguments*/);
// later
std::shared_ptr<Record> spTempBooks[10];
std::copy(spBooks, spBooks + 10, spTempBooks);
さらに良いのは、std::vector
s を使用することです。低レベルのメモリ処理は、魅力的に見えるかもしれませんが、見つけにくいバグにつながります。コンテナー クラスに処理を任せるのが賢明です。