String和Vector之间的差异作为方法的参数

Mac*_*nto 0 c++

当我使用字符串作为方法的参数时,函数中字符串的更改不会反映在调用函数中.简单的理由按价值传递.

但是当使用向量时,对向量的更改将反映在调用函数中.所以我的问题是传递向量就像调用引用一样,我们在内存中发送地址而不是变量,因此函数内的任何更改都会反映在调用函数中

------------------------更新------------------------- -------

所以向量必须仅通过引用传递?我不能正常做到吗?

当然你可以正常传递它们(通过值传递它们).但是当你按值传递对象时,会发生一个新对象,然后将传递的对象复制到新对象.此,对于标准类型(字符型,整型,浮点等等)是确定的,因为标准类型的体积小(char是一个字节,短为2,int是2或4,长为4等...).然而,矢量并不小.试着这样做:

1
2
3
4
5
6
7
8
9
10
11
12

#include <iostream>
#include <vector>
using namespace std;

int main()
{
     vector<int> v;
     cout << sizeof(v) << endl;

     system("pause");
     return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的电脑中我得到12作为输出.这是12个字节.因此,我不是通过值传递,而是通过引用传递它,其成本为4个字节(包含我的向量地址的变量的大小)

das*_*ght 5

但是当使用向量时,对向量的更改将反映在调用函数中.

这是因为通过引用传递.如果您通过std::string引用传递,您将获得相同的效果.

反之亦然:std::vector如果省略参数声明中的&符号,则可以传递一个by值.然而,这可能带来高成本,因为将复制矢量的整个内容.

所以向量必须仅通过引用传递?

它们不必通过引用传递,但在许多情况下,通过值传递过于昂贵,因此人们很少这样做.就所sizeof(v)涉及的而言,您只获得了使用向量对象本身分配的向量的小占用空间(在这种情况下,它位于堆栈中).向量内部的指针也指向动态部分,sizeof操作员不会考虑这一部分.