web-dev-qa-db-ja.com

ベクトルを関数に渡す方法は?

関数への引数としてベクトルを送信しようとしていますが、それを機能させる方法がわかりません。さまざまな方法を試しましたが、すべて異なるエラーメッセージが表示されます。動作しないのはこの部分だけなので、コードの一部のみを含めます。 (ベクトル「ランダム」には、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);
}
77
Joe

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のメンバーに対応してアクセスするために.または->を使用する必要があります。

現在のコードの問題

  1. binarySearchにはvector<int>*が必要ですが、vector<int>を渡します(randomの前に&がありません)
  2. binarySearch内のポインターを使用する前に逆参照しないでください(たとえば、random[mid](*random)[mid]である必要があります)
  3. using namespace std;sの後に<include>がありません
  4. firstlastに割り当てる値が間違っています(random[0]random[99]の代わりに0と99でなければなりません)
122
Jon

ベクトル自体ではなく、ベクトルにポインターを渡す必要があります。ここで追加の「&」に注意してください。

found = binarySearch(first, last, search4, &random);
7
Mario

コレクション(またはポインターまたはコレクションへの参照)を関数に渡したいと思うときはいつでも、代わりにいくつかのイテレーターを渡せなかったかどうかを自問してください。そうすることにより、関数をより汎用的にすることができます(たとえば、必要なときに/別のタイプのコンテナー内のデータを簡単に処理できるようにします)。

もちろん、この場合、標準ライブラリにはすでに完全に優れたバイナリ検索機能が備わっているため、あまり意味はありませんが、まだ存在しないものを作成する場合は、さまざまな種類のコンテナで使用できることが非常に便利です。

2
Jerry Coffin

ポインター*randomを渡していますが、参照&randomのように使用しています

ポインター(あなたが持っているもの)は「これはランダムなアドレスを含むメモリ内のアドレスです」と言います

参照には、「これはランダムのアドレスです」とあります

2
corsiKa
found = binarySearch(first, last, search4, &random);

&に注意してください。

1
Daniel A. White

* randomの代わりにrandomを使用すると、コードはエラーになりません

0
Javad Yousefi

引数を参照として使用していますが、実際はポインターです。 vector<int>*vector<int>&に変更します。そして、実際に使用する前にsearch4を何かに設定する必要があります。

0
Puppy