2017-11-26 1 views
1

私はJavaの開発者で、私はC++を初めて使っています。 Javaを使用し
:私は、参照(ポインタ)を見つけるだろう 'myArrayList' で、次のstd :: vectorの代わりにオブジェクトのコピーではなく参照を格納する

myArrayList.add(obj); 

を行うことができますに「objの
しかしC++で:私は

std::vector::push_back(obj); 

ことを知っています'obj'のコピーを参照ではなくベクトルに挿入します。多数の操作とオブジェクトが作成されていない場合は、通常は問題にはなりません。

私の問題:のstd ::ベクトルを使用して作成され、重複したオブジェクトの数が多いのために
パフォーマンスの問題。
必要なもの:
std :: vectorの代わりに、またはオブジェクトを複製せずに参照(ポインタ)の動的リストを作成する他の方法があります。

PS:私はMAX_SIZEが知られることはありませんように私はこれを使用することはできません。この

MyClass** dynamic_array = new MyClass*[max_size]; 

のようなポインタの配列を作る知っています。

ありがとうございました。

答えて

0

これを解決する簡単な方法は、ポインタを使用することです。ここに例があります:

struct N { int x; }; 

void test() 
{ 
    N temp; 
    std::vector<N*> x; 
    x.push_back(&temp); 
} 
+0

@HDRgamingこのアプローチは動作しますが、生ポインタの使用の適切なケースではありません。一般的なルールは、[できる場合は参照を使用し、必要な場合はポインタを使用する](https://isocpp.org/wiki/faq/references#refs-vs-ptrs)です。 – VTT

2

あなたは代わりに参照ラッパーを保存することができます。

#include <functional>  

MyClass item; 
::std::vector<::std::reference_wrapper<MyClass>> items; 
items.emplace_back(item); 
// accessing an item will involve an extra call of get() method 
items.back().get(); 

注意を(Javaのとは異なり)オブジェクトがGCによって管理されていない、参照がその格納された基準が有効である十分な長生き残るオブジェクトことを確認するために、プログラマの責任であること。

+0

はい、しかし、reference_wrapperはオブジェクト自体 - >より多くのオブジェクトが作成された - >メモリ使用量です。 –

+5

@HDRgamingポインタ/参照をクラスにラップしてもメモリオーバーヘッドは発生しません。 – HolyBlackCat

+2

@HDRgaming C++でオブジェクトを作成する場合、必須のオーバーヘッドは必要ありません。また、 'std :: reference_wrapper'は、ローポインタやノーマルリファレンスにオーバーヘッドを導入しない、軽量プロキシクラスです。 – VTT

関連する問題