벡터를 함수에 전달하는 방법은 무엇입니까?


85

벡터를 함수에 대한 인수로 보내려고하는데 어떻게 작동하는지 알 수 없습니다. 여러 가지 방법을 시도했지만 모두 다른 오류 메시지를 표시합니다. 이 부분 만 작동하지 않기 때문에 코드의 일부만 포함합니다. (벡터 "random"은 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)!
Bo Persson 2011 년

1
사용 using namespace std;은 나쁜 생각입니다. 왜?
Tomask

답변:


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>*하지만 a 를 전달합니다 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"가 마지막 하나. 0과 99의 값이되는 것을 원하지 않습니다.
Joe

조 : first하고 last있는 인덱스 가 아닌 값. 그들이 무엇을 나타내는 지 혼란스러워합니다.

그런 다음 Last벡터의 마지막 값을 어떻게 제공 합니까?

오, 미안 해요, 지금 제가 실수를 봤어요. 감사합니다!
Joe

1
@lecaruyer : 간단히 말해서, 값을 전달한다는 것은 벡터의 내용이 복사 구성이 가능해야하고 실제로 모든 사본이 생성된다는 것을 의미합니다. 이것의 효과는 실제로 무시할 수있는 것에서부터 성능 및 / 또는 리소스 관점에서 매우 문제가되는 것, 컴파일조차하지 않는 코드에 이르기까지 다양합니다. 두 번째 사본을 원하지 않는 한 그렇게 할 이유가 없습니다.
Jon

8

벡터 자체가 아니라 벡터에 대한 포인터를 전달해야합니다. 여기에 추가 '&'가 있습니다.

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

2

포인터를 전달하고 *random있지만 참조처럼 사용하고 있습니다.&random

포인터 (당신이 가지고있는 것)는 "이것은 임의의 주소를 포함하는 메모리의 주소입니다"라고 말합니다.

참조는 "이것은 임의의 주소입니다"라고 말합니다.


2

컬렉션 (또는 포인터 또는 참조)을 함수에 전달하고 싶을 때마다 두 개의 반복자를 대신 전달할 수 없는지 자문 해보십시오. 그렇게함으로써 함수를 더욱 다양하게 만들 수 있습니다 (예 : 필요할 때 다른 유형의 컨테이너에있는 데이터로 작업하는 것을 사소하게 만들 수 있습니다).

물론이 경우에는 표준 라이브러리가 이미 완벽하게 좋은 바이너리 검색 기능을 가지고 있기 때문에 그다지 의미가 없지만, 아직없는 것을 작성할 때 / 만약 다른 유형의 컨테이너에서 사용할 수 있다는 것은 종종 매우 편리합니다.



0

인수를 참조로 사용하고 있지만 실제로는 포인터입니다. 변경 vector<int>*vector<int>&. 그리고 search4그것을 사용하기 전에 정말로 무언가를 설정해야 합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.