【问题标题】:Trouble with types when passing vector to function in c++将向量传递给C++中的函数时出现类型问题
【发布时间】:2014-01-26 04:44:33
【问题描述】:

我正在开始一个 c++ 类,以前从未在该语言中做过任何事情,我对向量感到很困惑。我做了一个玩具示例,但我不太明白为什么我放入向量中的双精度数变成向量的.代码如下:

#include <iostream>
#include <vector>
using namespace std;

vector<double> a;
void func(vector<double> *);

int main()
{
    for (int i = 0; i < 100; i++)
    {
        a.push_back(double(i));
    }   
    func(&a);
    return 0;
}   

void func(vector<double> *vec)
{
    cout << double(vec[0]) << endl;
    return; 
}  

它最终给了我这个错误: 错误:无法将“vector”转换为“double” 转换运算符 我不知道那是什么意思。这里到底发生了什么?如何将向量转换为双精度?

【问题讨论】:

    标签: c++ vector


    【解决方案1】:

    您无需将指针*std::vector 混合使用。

    方法一(不推荐):

    改变

    cout << double(vec[0]) << endl;
    

    cout << double((*vec).at(0)) << endl;
    

    方法二:

    1. 改变

      void func(vector<double> *vec)
      

      void func(vector<double> vec)
      

      void func(const vector<double> &vec)
      
    2. 改变

      func(&a);
      

      func(a);
      

    【讨论】:

    • 天哪,这很完美,但为什么会这样呢?我认为向量只是可以轻松调整大小的数组是错误的吗?
    • @user1023465 将指针*std::vector 混合使用是一种不好的做法。
    • @user1023465 更新答案。
    • 在堆栈上传递 vec 是一个非常糟糕的主意。 vector&lt;double&gt; vec 应该是 const vector&lt;double&gt;&amp; vec
    • @user1023465 “将向量视为可以轻松调整大小的数组是不是错了?” ——是的,完全错误。向量是一个对象实例。
    【解决方案2】:

    实际错误的原因更多是由于对指针的误解而不是向量。问题是您正在传递一个指向向量的指针。如果你想使用向量本身,那么你会这样做:

    cout << (*vec)[0] << endl;
    

    * 将取消引用指针以获取实际的向量实例,而不是像您之前所做的那样对地址进行索引。

    但是,正如另一个答案中所指出的,通过引用(或者更好的是,const 引用)传递向量更安全:

    void func(const vector<double>& vec)
    {
        cout << vec[0] << endl;
        return; 
    }
    

    然后调用为:

    func(a);
    

    【讨论】:

      【解决方案3】:

      使用vectors 的另一种方法是像这样使用std::vector&lt; TYPE &gt;::const_iterator

      #include <iostream>
      #include <vector>
      
      double func(std::vector<double>::const_iterator iter);
      
      
      int main()
      {
          std::vector<double> vec;
      
          for (double i = 0.0; i < 1; i += 0.1){
              vec.push_back(i);
          }
      
          std::cout<< func(vec.begin()+3) << " "
      
                   << func(vec.begin()+6) << std::endl;
      
          return 0;
      }  
      
      double func(std::vector<double>::const_iterator iter){
          return *iter;
      }
      

      输出;

      0.3 0.6
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-27
        • 2014-04-03
        • 2015-09-10
        • 1970-01-01
        • 2011-12-02
        • 2017-10-23
        • 1970-01-01
        • 2011-08-06
        相关资源
        最近更新 更多