在C++中通过指针和引用传递向量。

12 浏览
0 Comments

在C++中通过指针和引用传递向量。

关于如何在C++中安全地传递和使用向量的一个快速问题。\n我知道在使用向量时,对它们及其元素的地址要非常小心,因为当您动态更改它们的大小时,它们的地址可能会改变(除非您使用reserve等,但我想我不知道需要多少空间)。\n现在,我想将现有的向量(在其他地方创建)传递给一个函数,该函数会对其进行适配并更改其大小等,但是我对于什么是安全的做法有些不清楚,因为我通常会使用指针来实现所有这些。此外,还可以使用对向量的引用,这使我感到困惑。\n例如,看下面这两个函数和其中的注释:\n

void function1(std::vector* vec){
    std::cout<<"the size of the vector is: "<size()<pushback(i); 有什么区别吗?
    }
    std::cout<<"the size of the vector is: "<size()<

\n和\n

void function2(std::vector& vec){
    std::cout<<"the size of the vector is: "<

\n这两个函数在功能和安全性方面有什么区别吗?\n换句话说,如果我只有一个指向向量的指针/引用,并且需要调整其大小,那么我如何确保向量实际上在内存中的位置,或者对向量的指针实际上是什么,在我对其进行操作后。谢谢。

0
0 Comments

在C++中,通过指针和引用传递向量存在一些差异。这篇文章将讨论这个问题的原因以及解决方法。

从功能角度来看,在你提供的非常有限的上下文中,它们基本上是相同的。但是在更一般的情况下,如果你想编写通用代码,需要考虑操作和运算符直接与引用绑定,而不是与指针绑定。

例如,要编译以下代码需要:

a = b + c;

对应的函数应该是:

A operator+(const B&, const C&);

而不是:

A* operator+(const B*, const C*);

这两者是不同的。此外,接受引用和接受值的表达式具有相同的语法,但是接受指针的表达式需要对指针进行解引用才能提供相同的语义,这导致了不同的表达式语法(`*a + *b` 与 `a + b`),因此导致了"更不通用的代码"。

另一方面,如果你正在编写一个具有运行时多态性(并且考虑到Liskov替换原则)的类,那么你很可能会处理动态分配的对象,因此通过指针来操作它们可能更自然一些。

当然,还存在一些"灰色地带",两者可能会混合使用。但是一般来说,基于运行时的面向对象框架更常用指针传递函数,而基于值的通用算法更常用引用传递函数,其中静态类型推断是期望的,并且最可能想要在堆栈上进行分配。

总之,通过指针和引用传递向量在C++中存在一些差异。在编写通用代码时,需要考虑操作和运算符与引用直接绑定的特性。如果你正在处理动态分配的对象并且需要运行时多态性,则更自然地使用指针。在实际应用中,需要根据具体情况选择使用哪种传递方式。

0