ベクトルの要素へのポインタのベクトルを作成する簡単な方法はありますか?私はあなたがこれを行う必要がありますない理由を見ない参照C++のベクトルからポインタのベクトルを取得
答えて
@Benoitが示唆しているように、これらのポインタを格納するのは悪い考えです。あなたが本当にがそれをやりたいなら、あなたはこのようなstd::transform
を使用することができます。すべての
template<class T>
struct Address
{
T* operator()(T& t) const
{
return &t;
}
};
template<class T>
vector<T*> fn(vector<T>& v)
{
vector<T*> r;
transform(v.begin(), v.end(), back_inserter(r), Address<T>());
return r;
}
int main(void)
{
vector<int> a;
a.push_back(0);
fn(a);
}
それを指摘した誰もが、それは間違いなく、有用な知識であるこの答えのおかげで、それはお粗末なものだったことを指摘した。 – Sam
することで、受信ベクトル:
std::vector<T*> fn(std::vector<T> &v)
{
std::vector<T*> r;
for (int i = 0; i < v.size(); i++)
{
r.push_back(&v[i]);
}
return r;
}
以下EDITより
すなわち容易になります。 v
が成長した場合、ポインタが無効になることがあります。 r[i]
は、&v[i]
のエイリアスです。
実際にポインタを渡す必要がある場合(まだ理解できませんでした)、&v[0]
とベクターのサイズを渡すことができます。 std::vector
のすべての実装では、ベクトルの要素がメモリに連続して格納されることを保証する必要があるため、最初の要素のアドレスとベクトルのサイズからすべてのアドレスを推定できます。
これを行う標準ライブラリ機能はありません。
std::vector<T*> pv(v.size());
for (size_t i=0; i<v.size(); ++i)
pv[i] = &v[i];
は、おそらくC++ 0x lambdasを使用しない場合、このループの最も短い表現です。
あなたはの線に沿って何か行うことができます:
template <typename T>
T* mk_ptr(T& t) {
return &t;
}
template <typename T>
std::vector<T*> fn(std::vector<T>& v) {
std::vector<T*> r;
std::transform(v.begin(), v.end(), std::back_inserter(r), mk_ptr);
return r;
}
をしかし、一つは、このの動機について疑問に持っている...理由のためのイテレータがあります。誰もポインタが有効であることを保証しません。
まずあなたが正しい方法を見つける必要があります。あなたのコード(編集:元のコードv
は値渡しです)は間違っており、未定義の動作が発生します。アプリケーションによっては、通常、pointer containerまたはsmart pointersを格納する通常のコンテナが必要です。
- 1. C++ - ベクトルへの内部ポインタを取得
- 2. ポインタ(ポインタ)と新しい/ mallocベクトル(ベクトルの内側)C++
- 3. Boost.PythonとC++ std ::ポインタのベクトル
- 4. ベクトル、ポインタ、クラス、EoFループ(C++)
- 5. オブジェクトのC++ベクトルとオブジェクトへのポインタのベクトル
- 6. ポインタのベクトルへのポインタ
- 7. ポインタのC++ベクトルを作成する
- 8. ポインタを使ったC++のベクトルpush_back
- 9. C++:ポインタのベクトルを完全にコピー
- 10. ベクトルのベクトルをポインタのポインタに変換する
- 11. 別のスクリプトからベクトル3を取得する(C#Unity)
- 12. "Merge"ベクトルへのポインタ
- 13. 構造体のベクトルから特定のメンバーのベクトルを取得します
- 14. ポインタをベクトルのベクトルにpush_backするのはメモリリークですか?
- 15. ベクトル宣言のC++ベクトル
- 16. constポインタのベクトルへのポインタのベクトルからの再解釈は安全ですか?
- 17. Unity取得のクリックイベントのベクトル
- 18. オブジェクトへのベクトルのポインタ
- 19. ポインタのベクトルへのアクセス?
- 20. クラスメソッドへのポインタのベクトルQT
- 21. 共有ポインタのベクトル、ベクトルをクリアした後のメモリの問題
- 22. セグメンテーションフォールトの取得(ベクトル宣言)
- 23. 動的オブジェクトへのポインタを含む他のベクトルを含むベクトル
- 24. 複数のメモリリーク - ベクトルとポインタ
- 25. ベクトルとポインタの構文
- 26. C++からC#への3Dベクトル構造
- 27. C++ std ::ペアのベクトル変換 - >最初から新しいベクトル
- 28. ベクトルを返す関数からベクトル値を取得する方法は?
- 29. タプルのベクトルからタプルのベクトルへ
- 30. ベクトルのベクトルをC++で反復する
何をお探しですか?どのような場合でも、あなたが今持っているものは悪いです:関数ローカル変数 'v'の要素へのポインタを取得しています。それらのポインタはあなたが戻ってくるとすぐにぶら下がります。パラメータを参照にする必要があります。 – GManNickG
与えられた例は、関数が終了した後に存在しないオブジェクトへのポインタのベクトルになります。プロトタイプを 'std :: vector fn(std :: vector &v) 'にしたい、つまり破壊されるコピーではなくソースベクトルの参照を渡すとします。 –
pmdj
そのコードは、ぶら下がっているポインタを作成し、 'v'とその要素のすべてが' fn'が残ったときに割り当て解除されるので、ほとんどのシステムでは簡単にクラッシュしたり予期せず動作します。 – Philipp