2016-04-01 13 views
2

Cタイプの生ポインタを使用している場合、データコピーを持たないポインタのデータを所有するのと同じタイプ(移動のみ)のstd::vectorを作成できますか?この質問に私が動機づけているのは、std::vectorのメンバー関数data()の存在です。これは、ベクトルの要素がメモリのどこかに連続して存在していることを意味します。ポインタがデータコピーを持たないベクトルによって所有される可能性はありますか?

編集:私が持っていた希望は、std::make_sharedのような機能の存在によっても強化されていると付け加えなければならない。

+0

はい、ただし、ベクターのサイズが変更され、ポインタが無効になる恐れがあります。ベクトルが決してサイズを変更せず、これを保証できる場合、あなたは安全です。 – user4581301

+0

バッファを割り当てていますか?それでは、その代わりにベクトルをさせることができます。さもなければ、私はこれがどのように達成されるかを知らない。 – 5gon12eder

+0

@ user4581301既存の配列の所有権をベクターに転送できますか?これは私にニュースです – vu1p3n0x

答えて

2

私はこの機能を見逃すことはできませんが、これは直接可能ではないと思います。 std::stringにはさらにconstdataのメンバーがいません。うまくいけば、これはC++で変更されます17。

バッファを自分で割り当てる場合は解決策があります。前もってstd::vectorを使用してください。たとえば、次のCスタイルの関数があるとします。

extern void 
fill_in_the_numbers(double * buffer, std::size_t count); 

次に、次のことができます。また

std::vector<double> 
get_the_numbers_1st(const std::size_t n) 
{ 
    auto numbers = std::vector<double> (n); 
    fill_in_the_numbers(numbers.data(), numbers.size()); 
    return numbers; 
} 

、あなたはとても幸運ではないですし、あなたのCスタイルの関数はメモリ自体を割り当てるに主張した場合、

extern double * 
allocate_the_buffer_and_fill_in_the_numbers(std::size_t n); 

あなたは悲しげに劣っている、std::unique_ptrに頼ることができます。

std::unique_ptr<double[], void (*)(void *)> 
get_the_numbers_2nd(const std::size_t n) 
{ 
    return { 
    allocate_the_buffer_and_fill_in_the_numbers(n), 
    &std::free 
    }; 
} 
2

いいえ、std::vectorは、既存のアレイを内部ストレージとして使用/使用できるように設計されていません。

0

ときvec.size() == vec.capacity() - 1あなたは新しい要素を追加しませんポインタを取得する前に、あなたがいない

  1. 任意の要素
  2. を消去することをはい、あなたはが作成され、ベクトル人口たことを提供し,,,要素のアドレスを変更しますので、やっ

#include <iostream> 

void fill_my_vector<std::vector<double>& vec){ 
    for(int i=0; i<300; i++){ 
     vec.push_back(i); 
    } 
} 

void do_something(double* d, int size) 
{ /* ..... */ } 

int main(){ 
    std::vector<double> vec; 
    fill_my_vector(vec); 
    //You hereby promise to follow the contract conditions, then you are safe doing this 

    double* ptr; 
    int ptr_len = vec.size(); 
    ptr = &vec[0]; 

    //call do_something 
    do_something(ptr, ptr_len); 

    //ptr will be alive until this function scope exits 
} 

EDIT

すでに作成された配列からのデータを管理する意味ならば、あなたは...ベクトルが...それは作成されていない配列の所有権を取ることができない、独自の配列を管理することはできませんそのクラス(ベクトル)によって。

+0

はいの場合、今私の質問はどうですか? – Farzad

+0

さて、私の答えを「方法」に変更させてください – WhiZTiM

+0

お友達、私たちはどちらも問題を誤解しているようです。 @Farzadには、ベクトルで管理したいメモリのプールがあらかじめ割り当てられているようですが、ベクトルをメモリプールとして使用しないでください。 – user4581301

関連する問題