【问题标题】:How to pass a vector to a function?如何将向量传递给函数?
【发布时间】:2011-03-16 23:37:52
【问题描述】:

我正在尝试将向量作为参数发送给函数,但我不知道如何使其工作。尝试了很多不同的方法,但它们都给出了不同的错误信息。 我只包含部分代码,因为只有这部分不起作用。 (向量“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);
}

【问题讨论】:

  • 不起作用是什么意思?请发布错误。
  • 关于更新代码:参数 first 和 last 是来自向量的 ,而不是索引。您也永远不会设置要搜索的值 (search4)!
  • 使用using namespace std; 是个坏主意。 Why?

标签: c++ function vector


【解决方案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内部,需要使用.-&gt;对应访问random的成员。

您当前的代码存在问题

  1. binarySearch 需要 vector&lt;int&gt;*,但您传入 vector&lt;int&gt;(在 random 之前缺少 &amp;
  2. 在使用binarySearch 内的指针之前不要取消引用它(例如,random[mid] 应该是(*random)[mid]
  3. &lt;include&gt;s 后面缺少using namespace std;
  4. 您分配给firstlast 的值是错误的(应该是0 和99 而不是random[0]random[99]

【讨论】:

  • “你分配给 first 和 last 的值是错误的(应该是 0 和 99 而不是 random[0] 和 random[99]” - 但我希望“first”是第一个值随机和“最后一个”是最后一个。我不希望它们成为值 0 和 99。
  • Joe: firstlast索引,而不是值。你对它们代表什么感到困惑。
  • 那我怎么给Last这个向量的最后一个值呢?
  • 哦,对不起,我现在看到我的错误了。谢谢!
  • @lecaruyer:简而言之,按值传递意味着向量的内容必须是可复制构造的,并且实际上会创建所有内容的副本。从性能和/或资源的角度来看,这在实践中的影响范围从可以忽略不计到非常有问题,甚至代码甚至无法编译。没有理由这样做,除非你真的想要第二份。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    你传递了一个指针*random,但你使用它就像一个引用&amp;random

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

    引用说“这是随机的地址”

    【讨论】:

      【解决方案4】:

      每当您想将集合(或指针或引用)传递给函数时,问问自己是否不能传递几个迭代器。这样做可能会使您的功能更加通用(例如,在需要时/如果需要,可以轻松处理其他类型容器中的数据)。

      当然,在这种情况下,没有什么意义,因为标准库已经有非常好的二进制搜索,但是当/如果你写一些不存在的东西时,能够在不同类型的容器上使用它通常是相当不错的方便。

      【讨论】:

        【解决方案5】:
        found = binarySearch(first, last, search4, &random);
        

        注意&amp;

        【讨论】:

          【解决方案6】:

          您将参数用作参考,但实际上它是一个指针。将vector&lt;int&gt;* 更改为vector&lt;int&gt;&amp;。而且你真的应该在使用之前将search4 设置为某个值。

          【讨论】:

            【解决方案7】:

            如果您使用 random 而不是 * random 您的代码不会出现任何错误

            【讨论】:

              猜你喜欢
              • 2011-06-21
              • 1970-01-01
              • 1970-01-01
              • 2015-08-07
              • 1970-01-01
              • 1970-01-01
              • 2011-12-02
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多