vector<int> nums1 = nums; 引用赋值数组和非引用

张开发
2026/4/15 2:33:45 15 分钟阅读

分享文章

vector<int> nums1 = nums; 引用赋值数组和非引用
vector nums1 nums; 引用赋值数组和非引用文章目录vectorint nums1 nums; 引用赋值数组和非引用vectorint nums1nums; 与 vectorint nums1nums; 的区别1. 加了 引用2. 不加 值拷贝3. 实际示例4. 在你的原代码中的适用性总结引用 vs 副本的区别浅拷贝 vs 深拷贝对于 std::vectorint总结首先vectorint nums1nums;这种写法是可以的但它的效果与你的预期可能不同。让我通过搜索确认C中引用和非引用的区别关于vectorint nums1nums;这种写法我来详细解释一下vectorint nums1nums;与vectorint nums1nums;的区别1. 加了引用vectorintnums1nums;nums1是nums的别名它们指向同一块内存修改nums1中的元素就是修改nums中的元素不会创建新的 vector只是给现有 vector 起了个别名内存效率高没有复制开销2. 不加值拷贝vectorintnums1nums;创建一个新的 vector 对象nums1并将nums的内容复制过来修改nums1不会影响原始的nums有内存开销会分配新的空间存储副本3. 实际示例#includeiostream#includevectorusingnamespacestd;intmain(){vectorintnums{1,2,3,4,5};// 引用方式 - 别名vectorintnums1nums;// 值拷贝方式 - 新对象vectorintnums2nums;nums1[0]100;// 修改nums1实际上也修改了numsnums2[1]200;// 修改nums2不影响numscoutnums[0]: nums[0]endl;// 输出: 100 (被nums1修改)coutnums[1]: nums[1]endl;// 输出: 2 (未被nums2修改)coutnums1[0]: nums1[0]endl;// 输出: 100coutnums2[1]: nums2[1]endl;// 输出: 200return0;}4. 在你的原代码中的适用性对于你的原问题需要创建数组副本进行前缀和计算你应该使用vectorintnums1nums;// 不加创建副本而不是vectorintnums1nums;// 加只是别名会修改原数组因为如果你使用引用对nums1的修改会直接影响原始的nums数组。总结加: 创建引用别名共享内存无复制开销不加: 创建副本独立内存空间有复制开销对于你的算法题场景通常需要不加来创建独立副本让我搜索一下C中浅拷贝和深拷贝的概念来准确回答你的问题。实际上在C中vectorint nums1nums;和vectorint nums1nums;的区别不是浅拷贝和深拷贝的区别。让我详细解释引用 vs 副本的区别vectorint nums1 nums;这是引用reference不是拷贝nums1和nums指向同一个对象没有创建新对象也没有数据复制vectorint nums1 nums;这是深拷贝deep copy创建了一个全新的 vector 对象复制了所有元素到新的内存空间浅拷贝 vs 深拷贝浅拷贝和深拷贝主要涉及指针成员的处理// 自定义类的例子classMyClass{private:int*data;intsize;public:// 浅拷贝构造函数危险MyClass(constMyClassother){this-sizeother.size;this-dataother.data;// 只复制指针不复制指针指向的内容}// 深拷贝构造函数安全MyClass(constMyClassother){this-sizeother.size;this-datanewint[size];for(inti0;isize;i){this-data[i]other.data[i];}}};对于std::vectorintvectorint本身不包含指针成员所以vectorint nums1 nums;总是执行深拷贝vector的拷贝构造函数内部实现了深拷贝逻辑总结vectorint nums1 nums;→引用/别名无拷贝vectorint nums1 nums;→深拷贝创建完整副本浅拷贝/深拷贝的概念主要适用于包含动态分配内存指针的自定义类所以你的理解接近了但严格来说引用和副本的区别不是浅拷贝和深拷贝的区别。

更多文章