如何在初始化中将 'std::vector<double>' 转换为 'double'

Posted

技术标签:

【中文标题】如何在初始化中将 \'std::vector<double>\' 转换为 \'double\'【英文标题】:how to convert 'std::vector<double>' to 'double' in initialization如何在初始化中将 'std::vector<double>' 转换为 'double' 【发布时间】:2020-12-21 07:32:07 【问题描述】:

我正在尝试制作快速排序程序。我只是不明白为什么以及如何出现这个错误。我已经在网上尝试了所有方法,但我无法发现问题。如果我用数组代替向量来执行此操作,我会得到正确的输出,但会出现向量错误。

我的错误是:

.\quicksort.cpp:7:28: error: cannot convert 'std::vector&lt;double&gt;' to 'double' in initialization

double pivot = values[end];

.\quicksort.cpp:10:19: error: no match for 'operator&lt;=' (operand types are 'std::vector&lt;double&gt;' and 'double')

if (values[i] &lt;= pivot)

那么如何将vector&lt;double&gt; 转换为double 呢?

这是我的代码:

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

int partition(vector<double> *values, int start, int end) 
  double pivot = values[end];
  int pIndex = start;
  for (int i=start; i<end; i++) 
    if (values[i] <= pivot) 
      swap(values[i], values[pIndex]);
      pIndex++;
    
  
  swap(values[pIndex], values[end]);
  return pIndex;


void quicksort(vector<double> *values, int start, int end) 
  if (start<end) 
    int pIndex;
    pIndex = partition(values, start, end);
    quicksort(values, start, pIndex-1);
    quicksort(values, pIndex+1, end);
  



int main() 
  int n;
  cin >> n;
  vector<double> values(n);
  for (int i = 0; i < n; i++) 
    cin >> values[i];
  
  quicksort(values, 0, n-1);
  for (int j=0; j<n; j++) 
    cout<<values[j]<<" ";
  
  return 0;

如何纠正这些错误?

【问题讨论】:

【参考方案1】:

引用不是指针

int partition(vector<double>& values, int start, int end) 

void quicksort(vector<double>& values, int start, int end) 

如果你使用了指针(但你不应该),那么正确的代码应该是

double pivot = (*values)[end];

指针与它们所指向的东西不同,你必须使用*-&gt; 来获取指针指向的对象。您不必对引用执行此操作。

【讨论】:

解决方案奏效了。指针和引用的主要区别是什么?如何知道何时使用哪个?此外,当我使用数组时,它可以工作,但不适用于向量。怎么样? 数组是特殊的,它们在传递给函数时会自动转换为指针。此规则不适用于 任何 其他类型的对象,因此请忽略数组。至于指针和引用之间的区别,我相信你可以用谷歌搜索(这是一个比我在本评论中能够解决的更大的话题),并且选择使用哪个有时是一个见仁见智的问题。【参考方案2】: 您有一个 C++ 编译器,因此请使用它,将引用发送到您的对象而不是指针:
void  quicksort(vector<double> &values, const int start, const int end);
int  partition(vector<double> &values, const int start, const int end)

你的编译时错误消失了,指针指向你需要像这样调用你的函数的对象:

quicksort(&values, 0, n - 1);

因为你需要它的地址(实际上你的指针需要它)。

而且你需要使用std::vectoroperator[],首先需要从指向它的指针中获取std::vector 对象:

double  pivot  = (*values)[end];

正如您所见,它很丑陋并且可能很复杂,因此在这些情况下最好使用引用而不是指针。

【讨论】:

【参考方案3】:

您的分区和快速排序函数将指针作为参数而不是参考值。

你的函数应该这样声明:

int partition(vector<double> &values, int start, int end)
void quicksort(vector<double> &values, int start, int end)

您收到错误的原因是由于 values 参数是一个指针,当您使用数组访问器 ([i]) 时,它假定 values 是一个向量数组并返回一个向量而不是双精度数。

【讨论】:

【参考方案4】:

您应该将vector&lt;double&gt;&amp; 传递给您的函数而不是vector&lt;double&gt;*,即通过引用传递而不是通过指针传递。如果通过指针传递,则需要使用-&gt;[index]访问向量的元素。

【讨论】:

以上是关于如何在初始化中将 'std::vector<double>' 转换为 'double'的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 <numpy/arrayobject.h> 在 c++ 中将数据从 np.array 获取到 std::vector?

如何默认初始化 std::vector

在现代 C++ 中将 std::array<std::array<T,N>> 转换为 std::vector<T>

如何避免 std::vector<> 初始化其所有元素?

如何初始化std :: vector的静态constexpr成员 在c ++ 11中?

如何使用多次 memcpy 转换回 std::vector<unsigned char>?