【问题标题】:container as a function parameter容器作为函数参数
【发布时间】:2017-11-26 11:29:41
【问题描述】:
#include <iostream>
#include <vector>

using namespace std;

void factorial(vector<int> ivec, typename vector<int>::iterator iter) 
{
    vector<int>::iterator it;
    for (it = iter; it != ivec.end(); it++)
         cout << *it << endl;
}

int main()
{
    vector<int> ivec;
    for (int i = 1; i < 8; i++) 
        ivec.push_back(i);

    factorial(ivec, ivec.begin());

    return 0;
}

在 Visual Studio 2015 中显示,

但如果我让ivec 成为引用类型(vector&lt;int&gt; &amp; ivec),它将成功。

为什么?


代码很糟糕,很糟糕,很糟糕,所以请你把注意力集中在这个问题上。

【问题讨论】:

    标签: c++ function templates iterator containers


    【解决方案1】:

    因为迭代器与您从中获取它们的容器相关。由于您是按值传递向量,因此它就像第二个向量,并且不会发送比较第一个向量的迭代器和复制的迭代器的迭代器。

    【讨论】:

      【解决方案2】:

      因为您通过值复制向量来传递向量并使it != ivec.end() 未定义。

      当你通过值传递时,你正在做类似的事情

      vector<int> v1 =  {1,2,3,4,5,6,7};
      vector<int> v2 = v1; 
      //v2 is a copy of v1
      
      v1.end() == v2.end();
      //comparing end of different vectors don't have any sense.
      

      当你通过引用传递时,你正在做类似的事情

      vector<int> v1 = {1,2,3,4,5,6,7};
      vector<int>& v2 = v1;
      //v2 is a reference to v1, it's like an alias
      
      v1.end() ==  v2.end();
      //it makes sense because v2 is v1, not a copy
      

      或者如果你更熟悉指针

      vector<int> v1 = {1,2,3,4,5,6,7};
      vector<int>* v2 = &v1;
      
      v1.end() ==  v2->end();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-07
        • 2012-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-11
        • 1970-01-01
        相关资源
        最近更新 更多