-1

私はそのようなコードを持っています:

typedef intptr_t ptr_t;

const int num_elements = 100;
ptr_t *pstr = (ptr_t *)malloc(sizeof(ptr_t) * num_elements);
std::array<ptr_t,num_elements> *parray = new (pstr) std::array<ptr_t,num_elements>;

要素 1 から num_elements-2 をシャッフルできるようにしたいので、std::shuffle を使用することを考えました。

auto s = parray->begin()++;
auto e = parray->end()--;
std::random_shuffle ( s, e );

これにはオーバーロードされた関数がないという苦情があります。自分が間違っていることを理解できないことに、本当に愚かだと感じています。どうすればこれを正しく行うことができますか?

編集:回答とフィードバックにより、に変更されました

auto s = parray->begin();
s++;
auto e = parray->end();
std::random_shuffle ( s, e );

ただし、「auto e」では次のようになります。「auto」は「int *」とは間接性のレベルが異なります

4

2 に答える 2

5

あなたの直接の質問への答え:あなたのエラーは、インクリメントする前に元の値を返すポストインクリメント演算子を使用していると思います。std::arrayイテレータは基本的にポインタなので、試してみてください

auto s = parray->begin() + 1;
auto e = parray->end() - 1;

編集:さて、残りは。一体なぜそんなことをしているのですか?std::vector<int> arr(100)100 要素の動的配列を作成することを検討 しましたか? ポインターを直接操作することなく、同様の機能を備えていますか?

編集 2: コメントを読んだ後、ポインターとして指定された配列をシャッフルしようとしていることが問題であることがわかりました。その場合、私は新しい配置をまったく行いません。にポインターがあると仮定するとpstr、これは機能するはずです。

std::random_shuffle(pstr +1, pstr + num_elements - 1);

これが機能するのは、配列内の単純なポインターが、アルゴリズム ライブラリの目的でランダム アクセス反復子として機能するためです。

于 2012-05-03T20:44:08.183 に答える
2

コンパイラがそれを許可したとしても、あなたのコードはあなたが望むことをしません。begin()/から返される値に対してポスト インクリメント/デクリメントを使用しようとしているため、元の値をandend()に代入し、(可能であれば) 返される一時値をインクリメント/デクリメントします。割り当てられている値を変更したいようです。se

auto s= parray->begin();
auto e= parray->end();

++s;
--e;

std::random_shuffle(s, e);

または、とにかくランダムアクセスイテレータがあるようです:

 std::random_shuffle(parray->begin()+1, parray->end()-1);

-- を動的に割り当てている理由がわかりません。これは、最初std::arrayに使用するという点をほとんど無効にしているようstd::arrayです。

于 2012-05-03T20:44:14.553 に答える