gpt4 book ai didi

c++ - 传递包含 const 内容的 vector

转载 作者:太空狗 更新时间:2023-10-29 20:33:14 28 4
gpt4 key购买 nike

我有一个看起来像这样的 vector 。

std::vector<std::pair<int,int> > v;

我想将它传递给一个函数并使其保持不变。

第一次尝试

void fun(const std::vector<std::pair<int,int> > v)

但是那个函数让我有了这条线

std::pair<int,int> p = v[i];

我认为应该抛出错误,因为 pair 不是 const 类型。然后我意识到只有指针在 vector 中被声明为常量所以我尝试了

void fun(const std::vector<const std::pair<int,int> > v)

但这会引发关于没有转换的错误。

我敢肯定有一些我不了解的内部运作方式使这成为非法的,但希望有一些见解。谢谢。

最佳答案

我认为您在这里混淆了引用和值语义。让您测试的第一个函数签名:

void fun(const std::vector<std::pair<int,int> > v)

这会将函数参数复制到一个新对象中 v ,这是额外的 const -合格的。这样的签名很少有意义:要么你想将它作为 const 传递引用(以避免复制)或者您想通过非 const 传递它值,因为函数体将改变参数,但应对其唯一拷贝进行操作。此外,这个片段:

std::pair<int,int> p = v[i];

使用上述函数签名编译得很好,因为它复制位置 i 处的 vector 元素进入一个新的pair目的。后者可以发生突变,但这根本不会影响 vector 。

现在让我们考虑第二个函数签名:

void fun(const std::vector<const std::pair<int,int> > v)

这里还是和以前一样,另外,std::vector<const T>没有用,请参阅 this thread寻求解释。


如何解决?如果您不想复制参数,但函数不修改 vector ,请通过 const 传递它引用。如果函数修改了 vector 并且这些修改在调用方可见,则将其作为非 const 传递引用。如果函数修改了 vector ,但那将独立于调用方 vector 发生,则通过非 const 传递值。

关于c++ - 传递包含 const 内容的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56489650/

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