1

私はC#またはJavaでのプログラミングに慣れているので、C++では非常にうまくいっていません。簡単だと思いますが、うまくいきません。私を助けてください。

私はこれを持っています:


void swap(vector  * vet, int i, int j)
{
    int temp = vet[i];
    vet[i] = vet[j];
    vet[j] = temp;
}

私はこのようにメソッドを呼び出しています:


swap(&vet, j, j - 1);

私が欲しいのは、値を使用する代わりにポインタを使用してベクトルを渡すことです。

Obs:コードは「*」と「&」なしでうまくコンパイルされます。

私がやったので、少なくともポインタを勉強しようとしなければならないと言ってはいけません。私はこのいまいましいことを機能させることができません!

4

4 に答える 4

5

「ポインタを渡す」のではなく、参照によってベクトルを取得する必要があります。

void swap(std::vector<int>& vet, std::size_t i, std::size_t j)
{
    using std::swap;
    swap(vet[i], vet[j]);
}

http://en.cppreference.com/w/cpp/algorithm/swap

より慣用的なことに注意してください:

http://en.cppreference.com/w/cpp/algorithm/iter_swap

于 2012-10-22T22:07:01.197 に答える
4

これまでのところ、誰もが参照を使用するように指示して応答していますが、これは正しいですが、コードが機能しない理由を説明できていません。ここでの問題は、ポインタ演算を理解していないことです。

int10秒へのポインタがあるとしましょう。

// best to use a vector for this, but for the sake of example...
int *p = new int[10];

ここで、メモリのそのチャンクの2番目の値を変更する場合は、次のintように記述できます。

*(p + 1) = 20;

または、同等のもの:

p[1] = 20;

見る?これらの2つの行は同じことをします。ポインタに追加nすると、ポインタのアドレスがn * sizeof *pバイト単位で増加します。sizeofポインタ演算は、ビットを隠し、バイトの代わりに論理単位(要素)を操作できるので便利です。

だから、それを知って、あなたの壊れたコードに戻って:

vet[i] = vet[j];

i * sizeof *vetこれは、ポインタから離れたバイト、つまりベースアドレスから離れた完全なベクトルにインデックスを付けます。明らかにそれは間違っています、あなたoperator[]はベクトルで呼び出すことを望みました、すなわち、それを配列として扱います。ただし、これは配列ではないため、正しい構文は次のようになります。

(*vec)[i]

または

vec->operator[](i);

そうは言っても...参照を使用するだけです。より安全(オブジェクトが有効であることが保証されている)で慣用的です。

于 2012-10-22T22:17:38.723 に答える
3

あなたは次のようなことを試すことができます...

void swap(vector<int> &vet, int i, int j)
{
    int temp = vet[i];
    vet[i] = vet[j];
    vet[j] = temp;
}

スワップ関数を次のように呼び出します

swap(vet,i,j);

結論:参照変数を使用します。これらはJavaの参照に似ています。

于 2012-10-22T22:07:47.600 に答える
2

実際、C ++では、次のように言うだけです。

using std::swap;

swap(vet[i], vet[j]);
于 2012-10-22T22:14:40.917 に答える