通过由指针和参考矢量在C ++中(Pass vectors by pointer and refer

2019-11-03 09:13发布

有关如何安全通过,并在C使用矢量++一个简单的问题。

我知道,使用矢量时,你必须非常小心的地址给他们,他们的元素,因为当你动态地改变它们的大小,他们可能会改变他们的地址(除非你使用的储备等等,但我想象我怎么会不知道多少空间我需要)。

现在我想现有的矢量(别处创建)传递给相适应,并改变其大小等功能,但我,什么是安全的,因为我通常会用指针实现这一切有点不清楚。 在此之上有使用的矢量参考,这只是muddies水给我。

例如采取以下两种功能和意见在其中

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??

}

有两个功能之间,无论是在功能方面和在安全性方面有什么区别?

或者换句话说,如果我只有一个指针/引用的矢量和需要调整它我怎么能肯定这个矢量实际上是在内存中,或什么的指针向量真的是,以后我就可以操作。 谢谢。

Answer 1:

在功能来看,你给我们的非常有限的情况下,他们基本上是相同的。

在更普遍的看法,如果你想写通用代码,考虑到操作和运营商直接绑定到引用,而不是指针

a = b + c;

要编译要求

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

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

毕竟是一个不同的野兽。

此外,表达以参考和取值有相同的语法,但考虑指针需要指针的表达式是遵从提供相等的语义,但是这将导致不同的表达语法( *a + *b针对a+b )从而导致“少将军代码”。

在对口,如果你正在写有运行时多态性(记住和lyskov替代)类,你将最有可能把动态分配的对象,因此,操纵它们通过指针可能会更自然。

还有“灰色地带”,其中两件事情目,但-in中普通指针回吐功能是基于运行OOP框架更加频繁,同时服用参考功能是“基于价值的通用算法”更加频繁,其中静态类型推导预期和上基于堆栈的分配是最有可能想要的。



文章来源: Pass vectors by pointer and reference in C++