1

これが私が達成しようとしていることです:

#include <iostream>
using std::cout;

#include <vector>
using std::vector;

int main()
{
    vector<int> a {3, 7};

    int *p = &a.at (0); //assign 3

    for (int i = 0; i < 10; ++i) //swap and print (3,7,3...)
    {
        p = (*p == a.at (0) ? &a.at (1) : &a.at (0));
        cout << *p << '\n';
    }
}

生のポインターの代わりにスマートポインターを使用したいのですが、それらがはるかに優れていることを確認していますが、前後の切り替えを実装する方法を実際には理解できません (これは、ゲームで交代するために使用されます。Player *)。

std::unique_ptrここのポインターをとstd::shared_ptrの 2 つの別々のテストで置き換えてみました。resetスイッチを使用して、最初のポインターの後に乱数を与えました。

次に、std::weak_ptrインターフェイスはそれほど似ていませんが、必要なもののように見えるので試してみました。私が見てきたことから、それを使用する唯一の方法は を使用することであるため、 の呼び出しの先頭に追加して逆参照に追加lock()しようとしましたが、クラッシュしました。lock().reset

生のポインターの代わりにどのように使用できstd::weak_ptrますか、または実際に他のポインターのいずれかを使用できますか?

4

3 に答える 3

4

このタイプのインデックス操作に生のポインタを使用するのではなく、への挿入操作がイテレータを無効std::vector::iteratorにする可能性があることを念頭に置いて、 の使用を検討する必要があると思います。std::vectorたとえば、次のことができます。

typedef std::vector<int>::iterator iter_t;

vector<int> a {3, 7};

iter_t p = iter_t(&a.at(0)); //assign 3

for (int i = 0; i < 10; ++i) //swap and print (3,7,3...)
{
    p = (*p == a.at(0) ? iter_t(&a.at(1)) : iter_t(&a.at(0)));
    cout << *p << '\n';
}
于 2012-05-07T17:36:15.057 に答える
4

定義上、スマート ポインターは「はるかに優れている」わけではありません。これらは、指しているメモリを管理する必要がある場合にのみ役立ちます。

ポインターは単純に a 内の要素を指しているためvector、スマート ポインターはまったく必要ありません。ほとんどのスマート ポインターは、範囲外に出ると、指しているメモリを削除しようとします。この場合、鼻の悪魔が発生します。

ただし、ベクトルのサイズを変更すると、すべてのポインターが無効になる可能性があることに注意してください。ポインターがまだスコープ内にある間は、要素を追加または削除していないことを確認してください。

この場合、プレーヤーが順番に、私はおそらくポインターをまったく使用しませんが、次のようなものを使用します。

int main()
{
    vector<int> players {3, 7};

    int current_player = 0;

    while (!game_over())
    {
        cout << players[current_player] << '\n';
        current_player = (current_player + 1) % players.size();
    }
}
于 2012-05-07T17:37:13.953 に答える
0

ベクトル内のintをスマートポインタに変更するのではなく、ベクトル内のintへのスマートポインタが必要な場合があることに気づきました。私はそれを全くしません。ベクトルのイテレータを使用します。

for (int i = 0; i < 10; ++i) {
  auto it = it.begin() + (i % 2 ? 1:0);
  f(*it);
}

ベクトルの内部への共有、一意、またはその他のポインターを使用すると、悪い、悪い、悪いことが起こります。生のポインタを使用することは、それらが指しているものについて何も示さないため、保証されません。一方、ベクターのイテレーターは、おそらく生のポインターとして実装されていますが、それらの使用に関して明確で文書化されたルールがあり、それらを使用してコードに文書化できます。

「スマートポインタ」にはイテレータが含まれていることを忘れないでください。

于 2012-05-07T17:49:47.040 に答える