c++ - 在 C++ 中通过指针和引用传递 vector

标签 c++ pointers vector

关于如何在 C++ 中安全地传递和使用 vector 的快速问题。

我知道在使用 vector 时你必须非常小心它们的地址和它们的元素,因为当你动态改变它们的大小时它们可能会改变它们的地址(除非你使用保留等。但我想我不知道我需要多少空间)。

现在我想将一个现有的 vector (在别处创建的)传递给一个函数,该函数可以调整它并改变它的大小等。但是我有点不清楚做什么是安全的,因为我通常会通过以下方式实现所有这些指针。最重要的是使用对 vector 的引用,这对我来说只是把水弄混了。

例如拿下面两个函数和里面的注释

void function1(std::vector<int>* vec){

    std::cout<<"the size of the vector is: "<<vec->size()<<std::endl; //presumably valid here  

    for (int i=0;i<10;i++){

        (*vec).pushback(i);  //Is this safe? Or will this fail?
        // Or: vec->pushback(i); Any difference?
    }

    std::cout<<"the size of the vector is: "<<vec->size()<<std::endl; //Is this line valid here??

}

void function2(std::vector<int>& vec){

    std::cout<<"the size of the vector is: "<<vec.size()<<std::endl; //presumably valid here  

    for (int i=0;i<10;i++){

        vec.pushback(i);  //Is this safe? Or will this fail?

    }

    std::cout<<"the size of the vector is: "<<vec.size()<<std::endl; //Is this line valid here??

}

这两种功能在功能性和安全性方面有什么区别吗?

或者换句话说,如果我只有一个指向 vector 的指针/引用并且需要调整它的大小,我怎么能确定 vector 在内存中的实际位置,或者指向 vector 的指针到底是什么,在我之后对其进行操作。谢谢。

最佳答案

就功能而言,在您提供给我们的非常有限的上下文中,它们本质上是相同的。

从更一般的角度来看,如果您想编写通用代码,请考虑将操作和运算符直接绑定(bind)到引用,而不是指针

a = b + c;

编译需要

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

但是

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

完全不同。

此外,获取引用和获取值的表达式具有相同的语法,但是获取指针的表达式要求指针是顺从的以提供相同的语义,但这会导致不同的表达式语法(*a + *b 反对 a+b )从而导致“不太通用的代码”。

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

两者存在“灰色区域”,但一般来说,指针获取函数在基于运行时的 OOP 框架中更频繁,而引用获取函数在“基于值的通用算法”中更频繁,其中静态类型扣除是预期的,并且最有可能需要基于堆栈的分配。

关于c++ - 在 C++ 中通过指针和引用传递 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26218356/

相关文章:

image - 什么是图像矢量?

c++ - 从多个 USB 摄像头捕获帧 - OpenCV,C++

c++ - 有什么方法可以只使用类运算符进行转换吗?

c++ - 用链表表示矩阵

c - 为结构体指针数组赋值

c++ - 如何在不使用继承的情况下转换用户定义类的指针

c - 在运行时获取数组的大小

c++ - 为什么要调用复制构造函数来构造一个空的 unique_ptr vector ?

c++ - 在 C++ 中的 vector 中的结构中搜索枚举

c++ - 错误 : expected class-name before ‘{’ token