web-dev-qa-db-ja.com

ベクトル内の値を交換しようとするC ++

これは私のスワップ関数です:

template <typename t>
void swap (t& x, t& y)
{
    t temp = x;
    x = y;
    y = temp;
    return;
}

そして、これは値をスワップするための関数です(サイドノートvに文字列を保存します)が、ベクトル内の値を使用して呼び出すとエラーが発生します。何が間違っているのかわかりません。

swap(v[position], v[nextposition]); //creates errors
45
user782311

あなたが探しているのは iter_swap で、これは<algorithm>にもあります。
する必要があるのは、交換したい要素の1つをそれぞれ指す2つの反復子を渡すだけです。
2つの要素の位置があるので、次のようなことができます。

// assuming your vector is called v
iter_swap(v.begin() + position, v.begin() + next_position);
// position, next_position are the indices of the elements you want to swap

提案された両方の可能性(std::swapおよびstd::iter_swap)動作しますが、構文はわずかに異なります。ベクトルの最初と2番目の要素、v[0]およびv[1]

オブジェクトの内容に基づいて交換できます:

std::swap(v[0],v[1]);

または、基礎となるイテレーターに基づいてスワップします。

std::iter_swap(v.begin(),v.begin()+1);

それを試してみてください:

int main() {
  int arr[] = {1,2,3,4,5,6,7,8,9};
  std::vector<int> * v = new std::vector<int>(arr, arr + sizeof(arr) / sizeof(arr[0]));
  // put one of the above swap lines here
  // ..
  for (std::vector<int>::iterator i=v->begin(); i!=v->end(); i++)
    std::cout << *i << " ";
  std::cout << std::endl;
}

どちらの場合も、最初の2つの要素が交換されます:

2 1 3 4 5 6 7 8 9
42
linse

std::swap in <algorithm>

21
Ólafur Waage

参照でベクトルを渡した後

swap(vector[position],vector[otherPosition]);

期待される結果が得られます。

4
faro_hf