関数への引数としてベクトルを送信しようとしていますが、それを機能させる方法がわかりません。さまざまな方法を試しましたが、すべて異なるエラーメッセージが表示されます。動作しないのはこの部分だけなので、コードの一部のみを含めます。 (ベクトル「ランダム」には、0〜200のランダムな値が格納されますが、ソートされています)
コードを更新しました:
#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);
}
vector
を参照として渡すのか、ポインターとして渡すのかによって異なります(値として渡すことは明らかに望ましくないというオプションを無視しています)。
参考として:
int binarySearch(int first, int last, int search4, vector<int>& random);
vector<int> random(100);
// ...
found = binarySearch(first, last, search4, random);
ポインターとして:
int binarySearch(int first, int last, int search4, vector<int>* random);
vector<int> random(100);
// ...
found = binarySearch(first, last, search4, &random);
binarySearch
内では、random
のメンバーに対応してアクセスするために.
または->
を使用する必要があります。
現在のコードの問題
binarySearch
にはvector<int>*
が必要ですが、vector<int>
を渡します(random
の前に&
がありません)binarySearch
内のポインターを使用する前に逆参照しないでください(たとえば、random[mid]
は(*random)[mid]
である必要があります)using namespace std;
sの後に<include>
がありませんfirst
とlast
に割り当てる値が間違っています(random[0]
とrandom[99]
の代わりに0と99でなければなりません)ベクトル自体ではなく、ベクトルにポインターを渡す必要があります。ここで追加の「&」に注意してください。
found = binarySearch(first, last, search4, &random);
コレクション(またはポインターまたはコレクションへの参照)を関数に渡したいと思うときはいつでも、代わりにいくつかのイテレーターを渡せなかったかどうかを自問してください。そうすることにより、関数をより汎用的にすることができます(たとえば、必要なときに/別のタイプのコンテナー内のデータを簡単に処理できるようにします)。
もちろん、この場合、標準ライブラリにはすでに完全に優れたバイナリ検索機能が備わっているため、あまり意味はありませんが、まだ存在しないものを作成する場合は、さまざまな種類のコンテナで使用できることが非常に便利です。
ポインター*random
を渡していますが、参照&random
のように使用しています
ポインター(あなたが持っているもの)は「これはランダムなアドレスを含むメモリ内のアドレスです」と言います
参照には、「これはランダムのアドレスです」とあります
found = binarySearch(first, last, search4, &random);
&
に注意してください。
* random
の代わりにrandom
を使用すると、コードはエラーになりません
引数を参照として使用していますが、実際はポインターです。 vector<int>*
をvector<int>&
に変更します。そして、実際に使用する前にsearch4
を何かに設定する必要があります。