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
215078 次浏览

There is a std::swap in <algorithm>

I think what you are looking for is iter_swap which you can find also in <algorithm>.
all you need to do is just pass two iterators each pointing at one of the elements you want to exchange.
since you have the position of the two elements, you can do something like this:

// 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

Both proposed possibilities (std::swap and std::iter_swap) work, they just have a slightly different syntax. Let's swap a vector's first and second element, v[0] and v[1].

We can swap based on the objects contents:

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

Or swap based on the underlying iterator:

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

Try it:

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;
}

Both times you get the first two elements swapped:

2 1 3 4 5 6 7 8 9

after passing the vector by reference

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

will produce the expected result.

  1. Using std::swap by including the <algorithm> library to swap values by references / smart pointers,
    e.g. std::swap(v[0], v[1])
    Note: v[i] is a reference

  2. Using std::iter_swap from the same library,
    e.g. std::iter_swap(v.begin(), v.begin() + v.size() - 1)

  3. Using lvalue references and rvalue tuple by including the <tuple> library
    e.g. std::tie(v[0], v[1]) = std::make_tuple(v[1], v[0])
    Note: constexpr since C++14