关于如何在 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/