如何将向量传递给函数?


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
在更新代码上:参数first和last是向量中的,而不是索引。您也永远不会设置要搜索的值(search4)!
Bo Persson

1
使用using namespace std;是一个坏主意。 为什么?
掩盖

Answers:


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>(缺少&before random
  2. binarySearch在使用它之前,请不要在内部取消引用指针(例如,random[mid](*random)[mid]
  3. susing namespace std;后您不见了<include>
  4. 分配给值firstlast是错误的(应该在0到99,而不是random[0]random[99]

“您分配给first和last的值是错误的(应为0和99,而不是random [0]和random [99]”)-但我希望“ first”成为random中的第一个值,而“ last”为最后一个,我不希望他们的值在0到99

乔:firstlast索引,而不是值。您对它们代表什么感到困惑。
乔恩

那我怎么给Last向量的最后一个值呢?

哦,对不起,我现在看到我的错误。谢谢!

1
@lecaruyer:简短地,按值传递意味着向量的内容必须是可复制构造的,并且实际上将创建所有内容的副本。在实践中,这种影响的范围可以忽略不计,甚至从性能和/或资源的角度来看非常有问题,甚至可以不编译。除非您确实确实想要第二份东西,否则没有理由这样做。
乔恩

8

您必须将指针传递给向量,而不是向量本身。请在此处注意附加的“&”:

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

2

您传递了一个指针,*random但您将其用作参考&random

指针(您所拥有的)说:“这是内存中包含随机地址的地址”

参考文献说“这是随机的地址”


2

每当您想将一个集合(或指针或对一个对象的引用)传递给一个函数时,请问自己是否不能传递几个迭代器。这样做的机会是,您将使功能更通用(例如,在需要时/在其他类型的容器中使用数据变得微不足道)。

当然,在这种情况下,没有什么意义,因为标准库已经具有非常好的二进制搜索功能,但是当/如果您编写的东西尚不存在,那么在不同类型的容器上使用它通常很方便。



0

您使用参数作为参考,但实际上它是一个指针。更改vector<int>*vector<int>&search4使用之前,您应该真正设置一些内容。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.