0

vectorバニラの C 配列と同じように、単にポインターの名前ですか?

vectorしたがって、a もポインターであるため、aを期待する関数引数への単一の非ベクトル データ (つまり、ポインター) にアドレスを送信できvectorます。

たとえば、次のように宣言された関数:

void RenderingEngine::Render(const vector<Visual>& visuals) const{

次のように呼び出すことができます。

Visual visual; // is NOT a vector
//do stuff with visual
m_renderingEngine->Render(&visual); 

意味があり、有効で合法的な C++ ですか?

このコード例は O'Reilly C++ の本からのものなので、本の間違いだと思います。

4

4 に答える 4

2

ベクトルの名前は、普通の C 配列と同じように単なるポインタですか?

いいえ、完全に形成されたクラスです。*


* さらに、通常の C 配列もポインターではありません (ほとんどの状況で 1 つになるだけです)。

于 2013-01-05T13:38:39.810 に答える
1

いいえ、意味がありません。T*からへの暗黙的な変換はありませんstd::vector<T>

しかし、C++11 では、自分がしていることに非常に近いことを行うことができます。引数を次のように渡しながら、その場でベクトルを作成できます。

m_renderingEngine->Render( {visual} );  //note the curly braces!

{visual}これで、関数に渡される式からベクトル オブジェクトを作成します。


1.コードを機能させるにはもう 1文字入力するだけでよいという意味で非常に近い。と入力する代わりに、 と最後にもう 1 つ入力します。それだ。C++11 を使えば生活はとても楽になります。&{}

于 2013-01-05T13:40:08.000 に答える
1

いいえ、そうではありません。C 配列の動作は忌まわしいので、これはむしろ幸運なことです。探している場合は、代わりに C++ に関する新しい学習教材を探すことをお勧めします。

于 2013-01-05T13:47:17.237 に答える
1

他の答えは正しいですが、逆に機能することを付け加えたいと思います:

void RenderingEngine::Render(Visual *visuals, size_t n_visuals);

次のように呼び出すことができます。

vector<Visual> visuals;
m_renderingEngine->Render(&visuals[0], visuals.size());

最初の要素のアドレスを取得して、それが配列であるかのように渡すだけです。これは、ベクトルの要素がメモリに順番に配置されるため機能します。(コメントで指摘されているように、もちろん、これを新しいコードで使用しないでください。ベクトルを取得するメソッドを定義する方が安全で簡単です。ただし、ポインターを取得するレガシー関数が既にある場合は、これにより独自のコードでベクトルを使用するには。)


このように機能する理由は、あなたの質問 (ベクトルを受け取る関数へのポインターを渡す) の方法ではなく、実行時に配列のサイズを決定できないためです。ただし、ベクトルを構築するにはサイズを知っている必要があります。

// (wrong code)
// Passing one element:
Visual visual;
m_renderingEngine->Render(&visual);

// Passing two elements, how does Render know that
// there are two elements at that address?
Visual[2] visuals;
m_renderingEngine->Render(&visuals[0]); 

Nawaz が指摘したように、C++11 でも同様のことができます。

Visual visual;
m_renderingEngine->Render( {visual} ); // C++11

にさらに要素を入れることもできます{}。これは、コンパイラがコンパイル時に要素がいくつあるかを知ることができるためにのみ機能します。これは、次の構文糖衣です。

vector<Visual> myVec = {visual};  // C++11
m_renderingEngine->Render(myVec);

これは、クラシックのように機能します。

vector<Visual> myVec;
myVec.push_back(visual);
m_renderingEngine->Render(myVec);

(C++11 バージョンは少し最適化されているかもしれませんが、確かなことはわかりません)。

于 2013-01-05T13:54:47.240 に答える