将数组转换为函数参数内的向量

时间:2016-12-22 13:04:38

标签: c++ arrays vector

让我们假设有一些数据存储在一个数组中,需要通过一个接受向量的函数。在这种情况下,显然需要将阵列数据转换为相应的矢量类型。一般的方法是

std::vector<int> vec(arr, arr+n);
function(vec);

其中arr是提到的数组变量。我知道我们只添加了一行,但它看起来像是一种不必要的代码污染。所以我尝试了这个

function(std::vector<int>(arr, arr+n))

什么有效。贝娄这里有详细的代码。

#include <vector>
#include <iostream>

void print(std::vector<int> vec){
    for(unsigned int i=0; i!=vec.size(); ++i){
        std::cout << vec[i] << std::endl;

    }
}

int main(){
    int a[] = {2,1,4,5,6};
    print(std::vector<int>(a,a+5));
}

由此,我的第一个问题是:这种方法还可以,或者它有一些不良行为?

之后,我决定将函数参数更改为接受像

这样的向量引用
void print(std::vector<int> &vec){
    for(unsigned int i=0; i!=vec.size(); ++i){
        std::cout << vec[i] << std::endl;

    }
}
什么都行不通。这是我得到的错误

test.cpp: In function ‘int main()’:
test.cpp:13:34: error: invalid initialization of non-const reference of type ‘std::vector<int>&’ from an rvalue of type ‘std::vector<int>’
     print(std::vector<int>(a,a+5));
                                  ^
test.cpp:4:6: error: in passing argument 1 of ‘void print(std::vector<int>&)’
 void print(std::vector<int> &vec){

这是第二个问题:为什么,当函数参数偶然发生向量引用时,这种方法不起作用。有一点可以解决这个编译错误,保持在参数函数中创建向量对象的方法吗?

2 个答案:

答案 0 :(得分:1)

问题是将rvalue(函数调用中的std::vector<int>(a,a+5))绑定到函数参数列表中的lvalue referencestd::vector<int> &vec)。 rvalue可以绑定到const lvalue reference,因此只要参数不会被更改,最简单的解决方案是编写

void print(const std::vector<int> &vec)

这样可以在向量上保存一个复制操作。或者,您可以通过使用rvalues参数将函数重载绑定显式写入rvalue reference

void print(std::vector<int>&& vec)

但是你必须要注意这个事实,这个重载只会 绑定到rvalues。因此,您必须维护两个函数,一个用于lvalues,另一个用于rvalues

有关lvaluesrvalues的进一步参考,请参阅示例Understanding lvalues and rvalues in C and C++或询问您最喜爱的搜索引擎; - )。

答案 1 :(得分:1)

在这行 print(std :: vector(a,a + 5))中,编译器创建一个临时对象,它是一个右值引用。这里我们试图将一个引用值传递给一个接受非const左值引用的函数,因此编译错误。相反,如果您声明print()方法接受右值引用,那么您可以摆脱编译错误。请参阅下面的代码段

<TabPane fx:id="tabPane" fx:controller="controllers.MainController"/>

关于左值,右值参考的更多信息,请参阅http://en.cppreference.com/w/cpp/language/reference