gpt4 book ai didi

c++ - 在函数参数内将数组转换为 vector

转载 作者:行者123 更新时间:2023-11-28 01:55:42 24 4
gpt4 key购买 nike

让我们想象一下,有一些数据存储在一个数组中,需要通过一个接受 vector 的函数。在这种情况下,显然需要将数组数据转换为相应的 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));
}

据此,我的第一个问题是:这种方法没问题,还是有一些不良行为?

之后,我决定更改函数参数以接受像这样的 vector 引用

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){

这是第二个问题:为什么,当函数参数偶然指向 vector 引用时,这种方法不起作用。有什么办法可以解决这个编译器错误,是否保留在参数函数中创建 vector 对象的方法?

最佳答案

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

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

顺便说一句,这为您节省了一次 vector 复制操作。或者你可以编写一个函数重载显式绑定(bind)到 rvalues通过拥有 rvalue reference参数。

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

但是你必须意识到这个事实,这个重载只会绑定(bind)到rvalues .所以你必须维护两个函数,一个用于 lvalues和一个 rvalues .

有关 lvalues 的进一步引用和 rvalues ,例如参见 Understanding lvalues and rvalues in C and C++或询问您最喜欢的搜索引擎 ;-)。

关于c++ - 在函数参数内将数组转换为 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41283862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com