Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ trying to swap values in a vector

Tags:

c++

vector

swap

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 
like image 352
user782311 Avatar asked Jun 03 '11 08:06

user782311


People also ask

Can we use swap in vector?

vector::swap()This function is used to swap the contents of one vector with another vector of same type and sizes of vectors may differ.

Can we swap 2 vectors?

To swap two vectors, you need only swap each of these members. By swapping the pointers, this vector will point to the other vector's data on the free store and the other will point to this one's data.

What does STD swap do?

The function std::swap() is a built-in function in the C++ Standard Template Library (STL) which swaps the value of two variables. Parameters: The function accepts two mandatory parameters a and b which are to be swapped. The parameters can be of any data type.


2 Answers

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 
like image 73
Moha the almighty camel Avatar answered Oct 18 '22 05:10

Moha the almighty camel


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 
like image 28
linse Avatar answered Oct 18 '22 05:10

linse