4

std::vector新しいものを作成する(またはそのメソッドを呼び出すassign) と、データのコピーが作成されるかどうかに興味がありますか?

例えば、

void fun(char *input) {
    std::vector<char> v(input, input+strlen(input));
    // is it safe to assume that the data input points to was COPIED into v?
}
4

5 に答える 5

11

はい。要素は常に STL コンテナー内または STL コンテナーからコピーされます。(少なくとも移動セマンティクスが C++0x に追加されるまで)

編集:自分自身をコピーすることをテストする方法は次のとおりです。

#include <vector>
#include <iostream>

class CopyChecker
{
public:
    CopyChecker()
    {
        std::cout << "Hey, look! A new copy checker!" << std::endl;
    }
    CopyChecker(const CopyChecker& other)
    {
        std::cout << "I'm the copy checker! No, I am! Wait, the"
            " two of us are the same!" << std::endl;
    }
    ~CopyChecker()
    {
        std::cout << "Erroap=02-0304-231~No Carrier" << std::endl;
    }
};

int main()
{
    std::vector<CopyChecker> doICopy;
    doICopy.push_back(CopyChecker());
}

出力は次のようになります。

ねえ、見て!新しいコピーチェッカー!
コピーチェッカーです!いいえ、そうです!待って、私たち二人は同じです!
Erroap=02-0304-231~No Carrier
Erroap=02-0304-231~No Carrier

于 2010-07-09T03:41:01.590 に答える
9

要素は常に STL コンテナー内または STL コンテナーからコピーされます。

要素は単なるポインターである可能性がありますが、その場合、ポインターはコピーされますが、基になるデータはコピーされません

于 2010-07-09T03:42:10.117 に答える
1

移動セマンティクスについて、必要に応じて C++0x でコンテンツを移動する方法を次に示します。

void fun_move(char *input)
{
    std::vector<char> v;
    auto len = strlen(input);
    v.reserve(len);
    std::move(input, input+len, std::back_inserter(v));
}
于 2010-07-09T09:01:21.630 に答える
0

オブジェクト コピー セマンティクスが必要ない場合は、代わりにオブジェクトへのポインターのベクトルを作成して、ポインターのみがコピーされるようにすることができます。ただし、ポインターがコンテナーの存続期間中有効であることを確認する必要があります。

于 2010-07-09T12:34:46.667 に答える
0

データを移動する場合は、を使用しstd::swap_rangesますが、最初にメモリを割り当てる必要があります。

vector<T> v;
v.reserve(std::distance(beg, end));
std::swap_ranges(beg, end, v.begin());
于 2010-07-09T09:20:06.530 に答える