std::vector的拷贝和初始化
在C++中,拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,并使用同类型的另一个对象的值来初始化它。拷贝构造函数通常在以下情况下被调用:
通过值传递方式传递对象给函数。
通过值返回方式从函数返回对象。
-
一个对象被另一个对象初始化。
- 如下的直接初始化,这意味着我们要求编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数
- 如下的拷贝初始化,这意味着我们要求编译器将右侧运算对象拷贝到我们正在创建的对象中(调用拷贝构造函数)
-
注意:
- std::vector无论通过直接初始化还是拷贝初始化,新的copiedVector的内存都和原始的originalVector不同;两者增删改查互不影响
- 即下面代码输出
Original Vector: 1 2 3 4 5 Copied Vector:100 2 3 4 5
#include <iostream>
#include <vector>
int main() {
// 创建一个原始的 vector
std::vector<int> originalVector = {1, 2, 3, 4, 5};
// 使用拷贝构造函数创建一个新的 vector,并初始化为原始 vector 的副本
std::vector<int> copiedVector(originalVector);//直接初始化
std::vector<int> copiedVector = originalVector;//拷贝初始化
// 修改新 vector 的第一个元素
copiedVector[0] = 100;
// 输出原始 vector 的内容
std::cout << "Original Vector: ";
for (int num : originalVector) {
std::cout << num << " ";//1 2 3 4 5
}
std::cout << "\n";
// 输出新 vector 的内容
std::cout << "Copied Vector: ";
for (int num : copiedVector) {
std::cout << num << " ";//100 2 3 4 5
}
return 0;
}
cv::Mat的拷贝和初始化
cv::Mat无论通过直接初始化还是拷贝初始化,新的copiedMat的内存都和原始的originalMat相同;两者增删改查互相影响
-
对于函数中的传值与引用,也都是浅拷贝,数据的改变也都会影响到源数据(即值传递方式传递对象给函数时用的是拷贝构造函数)
void A(cv::Mat image) void A(cv::Mat& image) 若要采用深拷贝,需要使用
originalMat.clone();
originalMat.copyTo(copiedMat4);
- clone()
和copyTo的区别:它们除了对不同的矩阵头文件做不同的内存操作外,最大的区别在于,clone()是复制一整个一模一样的Mat,而copyTo(),可以使用mask选择复制的范围,A.copyTo(B,mask) - 以下例子
int main(){
// 创建一个原始的cv::Mat
cv::Mat originalMat = cv::Mat::eye(3, 3, CV_32F);//创建一个3x3的单位矩阵
cv::Mat copiedMat1(originalMat);//直接初始化
cv::Mat copiedMat2 = originalMat;//拷贝初始化
cv::Mat copiedMat3 = originalMat.clone();//使用cv::Mat的深拷贝函数
cv::Mat copiedMat4;
originalMat.copyTo(copiedMat4);//使用cv::Mat的深拷贝函数
// 修改原始的cv::Mat
originalMat.at<float>(0, 0) = 99;
std::cout << "Original Matrix:\n" << originalMat << "\n";
std::cout << "Copied Matrix1:\n" << copiedMat1 << "\n";
std::cout << "Copied Matrix2:\n" << copiedMat2 << "\n";
std::cout << "Copied Matrix3:\n" << copiedMat3 << "\n";
std::cout << "Copied Matrix4:\n" << copiedMat4 << "\n";
return 0;
}
//输出:
Original Matrix:
[99, 0, 0;
0, 1, 0;
0, 0, 1]
Copied Matrix1:
[99, 0, 0;
0, 1, 0;
0, 0, 1]
Copied Matrix2:
[99, 0, 0;
0, 1, 0;
0, 0, 1]
Copied Matrix3:
[1, 0, 0;
0, 1, 0;
0, 0, 1]
Copied Matrix4:
[1, 0, 0;
0, 1, 0;
0, 0, 1]