How to pass a vector to a function?
Solution 1
It depends on if you want to pass the vector
as a reference or as a pointer (I am disregarding the option of passing it by value as clearly undesirable).
As a reference:
int binarySearch(int first, int last, int search4, vector<int>& random);
vector<int> random(100);
// ...
found = binarySearch(first, last, search4, random);
As a pointer:
int binarySearch(int first, int last, int search4, vector<int>* random);
vector<int> random(100);
// ...
found = binarySearch(first, last, search4, &random);
Inside binarySearch
, you will need to use .
or ->
to access the members of random
correspondingly.
Issues with your current code
binarySearch
expects avector<int>*
, but you pass in avector<int>
(missing a&
beforerandom
)- You do not dereference the pointer inside
binarySearch
before using it (for example,random[mid]
should be(*random)[mid]
- You are missing
using namespace std;
after the<include>
s - The values you assign to
first
andlast
are wrong (should be 0 and 99 instead ofrandom[0]
andrandom[99]
Solution 2
You'll have to pass the pointer to the vector, not the vector itself. Note the additional '&' here:
found = binarySearch(first, last, search4, &random);
Solution 3
Anytime you're tempted to pass a collection (or pointer or reference to one) to a function, ask yourself whether you couldn't pass a couple of iterators instead. Chances are that by doing so, you'll make your function more versatile (e.g., make it trivial to work with data in another type of container when/if needed).
In this case, of course, there's not much point since the standard library already has perfectly good binary searching, but when/if you write something that's not already there, being able to use it on different types of containers is often quite handy.
Solution 4
You're passing in a pointer *random
but you're using it like a reference &random
The pointer (what you have) says "This is the address in memory that contains the address of random"
The reference says "This is the address of random"
Solution 5
found = binarySearch(first, last, search4, &random);
Notice the &
.
Joe
Updated on March 28, 2020Comments
-
Joe about 4 years
I'm trying to send a vector as an argument to a function and i can't figure out how to make it work. Tried a bunch of different ways but they all give different error messages. I only include part of the code, since it's only this part that doesn't work. (the vector "random" is filled with random, but sorted, values between 0 and 200)
Updated the code:
#include <iostream> #include <ctime> #include <algorithm> #include <vector> using namespace std; int binarySearch(int first, int last, int search4, vector<int>& random); int main() { vector<int> random(100); int search4, found; int first = 0; int last = 99; found = binarySearch(first, last, search4, random); system("pause"); return(0); } int binarySearch(int first, int last, int search4, vector<int>& random) { do { int mid = (first + last) / 2; if (search4 > random[mid]) first = mid + 1; else if (search4 < random[mid]) last = mid - 1; else return mid; } while (first <= last); return -(first + 1); }
-
Joe about 13 years"The values you assign to first and last are wrong (should be 0 and 99 instead of random[0] and random[99]" - but i want "first" to be the first value in random and "last" to be the last one. I do not want them to be the values 0 and 99.
-
Waihon Yew about 13 yearsJoe:
first
andlast
are indexes, not values. You are confused as to what they represent. -
Joe about 13 yearsThen how do i give
Last
the last value of the vector? -
Joe about 13 yearsoh, i'm sorry, i see my misstake now. Thank you!
-
Prince Vijay Pratap over 8 years@Jon I have a small doubt after reading your second point, Why we can not dereference that pointer which collects the address of array when we pass it to a function.
-
Admin almost 7 yearsCan you explain why "the option of passing it by value is clearly undesirable" ? If I just want to print the element in it , will it be faster ?
-
Waihon Yew almost 7 years@lecaruyer: Briefly, passing by value means that the contents of the vector must be copy-constructible, and a copy of everything will actually be created. The effects of this could in practice range from negligible, to very problematic from a performance and/or resource point of view, to code that does not even compile. There's no reason to do it unless you really do want a second copy of the stuff.