79

This is my swap function:

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

And this is my function (on a side note v stores strings) call to swap values but whenever I try to call using values in a vector I get an error. I'm not sure what I'm doing wrong.

swap(v[position], v[nextposition]); //creates errors
Chowlett
  • 45,935
  • 20
  • 116
  • 150
user782311
  • 911
  • 2
  • 9
  • 9
  • 6
    Do you have somewhere `using namespace std` in your code? Because you could have a name conflict. – Benoit Jun 03 '11 at 08:47
  • 10
    BTW You don't need that `return;` statement at the end of your function – Karl von Moor Jun 03 '11 at 09:02
  • My best guess is that you are implementing a quadratic sort algorithm, and you have an off-by-one error, thus trying to access the vector out of bounds. It would really help to see the actual error message. Is it a compile-time error or a runtime error? – fredoverflow Jun 03 '11 at 09:07
  • 5
    Why aren't you just using `std::swap`? – John Dibling Jun 03 '11 at 13:33

5 Answers5

147

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
Moha the almighty camel
  • 4,327
  • 4
  • 30
  • 53
  • 9
    I had this same issue, and there are a lot of answers recommending std::swap (like the highest voted one here does) but std::swap does not work (directly) for swapping the contents of two elements of a vector. Your answer, with std::iter_swap does. – latreides Jan 09 '14 at 20:23
  • 2
    @latreides Could you please clarify what you mean by "std::swap does not work (directly) for swapping the contents of two elements of a vector"? – Chris Culter Jan 16 '16 at 06:44
  • @ChrisCulter Its been awhile since I made that comment (a little over two years), all I can recall is that std::swap did not give me the behavior I wanted (or expected) but std::iter_swap did. – latreides Jan 17 '16 at 02:07
  • 9
    Note that std::iter_swap(it1, it2) is equivalent to std::swap(*it1, *it2). – Superfly Jon May 05 '16 at 08:32
72

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
linse
  • 886
  • 6
  • 5
  • std::swap() does not work for iterators, consider using std::iter_swap() instead as it was suggested in another answer on this page. – Mar Mar 12 '16 at 03:57
  • 1
    @Mar As suggested by Superfly: Note that std::iter_swap(it1, it2) is equivalent to std::swap(*it1, *it2). So std::swap can work just fine. – leetNightshade Sep 16 '16 at 21:07
26

There is a std::swap in <algorithm>

Ólafur Waage
  • 68,817
  • 22
  • 142
  • 198
6

after passing the vector by reference

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

will produce the expected result.

faro_hf
  • 109
  • 1
  • 2
3
  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

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
R.E.L
  • 181
  • 3