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


85

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

1
動作しないとはどういう意味ですか?エラーを投稿してください。
Dat Chu

1
更新コードの場合:最初と最後のパラメーターは、インデックスではなく、ベクトルからのです。また、検索する値を設定することはありません(search4)!
ボーパーソン2011年

1
使用するのusing namespace std;は悪い考えです。 どうして?
Tomask 2015

回答:


131

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. あなたはsのusing namespace std;後に行方不明です<include>
  4. あなたがに割り当てる値firstlast間違っているが(0と99の代わりにする必要がありますrandom[0]し、random[99]

「最初と最後に割り当てる値が間違っています(random [0]とrandom [99]ではなく0と99である必要があります」-しかし、「first」をランダムの最初の値にし、「last」を最後の1つ。値を0と99にしたくない。–
Joe

Joe:firstlastインデックスであり、値ではありません。あなたはそれらが何を表しているのか混乱しています。
ジョン

次にLast、ベクトルの最後の値を指定するにはどうすればよいですか?
ジョー

ああ、すみません、私は今私の間違いを見ています。ありがとうございました!
ジョー

1
@lecaruyer:簡単に言うと、値を渡すということは、ベクトルの内容がコピー構築可能でなければならず、すべてのコピーが実際に作成されることを意味します。これによる影響は、実際にはごくわずかなものから、パフォーマンスやリソースの観点から非常に問題のあるもの、コンパイルすらできないコードまでさまざまです。あなたが本当にものの2番目のコピーが必要でない限り、それをする理由はありません。
ジョン

8

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

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

2

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

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

参照には「これはランダムのアドレスです」と書かれています


2

コレクション(またはコレクションへのポインターまたは参照)を関数に渡したい場合は、代わりに2つのイテレーターを渡すことができないかどうかを自問してください。そうすることで、関数の用途が広がる可能性があります(たとえば、必要に応じて、別のタイプのコンテナー内のデータを簡単に操作できるようにします)。

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



0

引数を参照として使用していますが、実際にはポインターです。に変更vector<int>*vector<int>&ます。そして、あなたはsearch4それを使う前に本当に何かに設定するべきです。


0

コードのrandom代わりに使用する場合* random、エラーは発生しません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.