如何在初始化中将 '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<double>' to 'double' in initialization
double pivot = values[end];
.\quicksort.cpp:10:19: error: no match for 'operator<=' (operand types are 'std::vector<double>' and 'double')
if (values[i] <= pivot)
那么如何将vector<double>
转换为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];
指针与它们所指向的东西不同,你必须使用*
或->
来获取指针指向的对象。您不必对引用执行此操作。
【讨论】:
解决方案奏效了。指针和引用的主要区别是什么?如何知道何时使用哪个?此外,当我使用数组时,它可以工作,但不适用于向量。怎么样? 数组是特殊的,它们在传递给函数时会自动转换为指针。此规则不适用于 任何 其他类型的对象,因此请忽略数组。至于指针和引用之间的区别,我相信你可以用谷歌搜索(这是一个比我在本评论中能够解决的更大的话题),并且选择使用哪个有时是一个见仁见智的问题。【参考方案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::vector
的operator[]
,首先需要从指向它的指针中获取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<double>&
传递给您的函数而不是vector<double>*
,即通过引用传递而不是通过指针传递。如果通过指针传递,则需要使用->[index]
访问向量的元素。
【讨论】:
以上是关于如何在初始化中将 'std::vector<double>' 转换为 'double'的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 <numpy/arrayobject.h> 在 c++ 中将数据从 np.array 获取到 std::vector?
在现代 C++ 中将 std::array<std::array<T,N>> 转换为 std::vector<T>