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

时间:2014-10-06 14:24:59

标签: c++ pointers vector

关于如何在c ++中安全传递和使用向量的快速问题。

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

现在我想将一个现有的矢量(在其他地方创建)传递给一个适应它的函数并改变它的大小等等。但我不清楚什么是安全的,因为我通常会实现所有这一切用指针。最重要的是,使用了对矢量的引用,这对我来说只是混淆了水。

例如,将以下两个函数和注释放在其中

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

}

这两个功能在功能性和安全性方面是否有任何区别?

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

1 个答案:

答案 0 :(得分:1)

就功能而言,在你给我们的非常有限的背景下,它们基本上是相同的。

在更一般的视图中,如果要编写通用代码,请考虑操作和运算符直接绑定到引用,而不是绑定到指针

a = b + c;

编译需要

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

但是

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

是一个不同的野兽。

此外,采用引用和获取值的表达式具有相同的语法,但是使用指针的表达式需要使用指针来提供相同的语义,但这会导致不同的表达式语法(*a + *b针对a+b因此导致“不太通用的代码”。

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

“灰色区域”中有两个东西是网格化的,但是 - 在一般情况下,指针获取函数在基于运行时的OOP框架中更常见,而参考函数在“基于值的泛型算法”中更常见,其中静态类型预期扣除,并且很可能需要基于堆栈的分配。