关于如何在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??
}
这两个功能在功能性和安全性方面是否有任何区别?
或者换句话说,如果我只有一个向量的指针/引用并且需要调整它的大小,我怎么能确定向量实际存在于内存中的位置,或者指向向量的指针到底是什么,在我之后对它进行操作。感谢。
答案 0 :(得分:1)
就功能而言,在你给我们的非常有限的背景下,它们基本上是相同的。
在更一般的视图中,如果要编写通用代码,请考虑操作和运算符直接绑定到引用,而不是绑定到指针
a = b + c;
编译需要
A operator+(const B&, const C&);
但是
A* operator+(const B*, const C*);
是一个不同的野兽。
此外,采用引用和获取值的表达式具有相同的语法,但是使用指针的表达式需要使用指针来提供相同的语义,但这会导致不同的表达式语法(*a + *b
针对a+b
因此导致“不太通用的代码”。
在对应方面,如果你正在编写一个具有运行时多态性(并考虑到lyskov替换)的类,你很可能会处理动态分配的对象,因此,通过指针操作它们可能更自然。
“灰色区域”中有两个东西是网格化的,但是 - 在一般情况下,指针获取函数在基于运行时的OOP框架中更常见,而参考函数在“基于值的泛型算法”中更常见,其中静态类型预期扣除,并且很可能需要基于堆栈的分配。