std::vector的拷貝和初始化
在C++中,拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),用于創(chuàng)建一個(gè)新對(duì)象,并使用同類型的另一個(gè)對(duì)象的值來初始化它??截悩?gòu)造函數(shù)通常在以下情況下被調(diào)用:
通過值傳遞方式傳遞對(duì)象給函數(shù)。
通過值返回方式從函數(shù)返回對(duì)象。
-
一個(gè)對(duì)象被另一個(gè)對(duì)象初始化。
- 如下的直接初始化,這意味著我們要求編譯器使用普通的函數(shù)匹配來選擇與我們提供的參數(shù)最匹配的構(gòu)造函數(shù)
- 如下的拷貝初始化,這意味著我們要求編譯器將右側(cè)運(yùn)算對(duì)象拷貝到我們正在創(chuàng)建的對(duì)象中(調(diào)用拷貝構(gòu)造函數(shù))
-
注意:
- std::vector無論通過直接初始化還是拷貝初始化,新的copiedVector的內(nèi)存都和原始的originalVector不同;兩者增刪改查互不影響
- 即下面代碼輸出
Original Vector: 1 2 3 4 5 Copied Vector:100 2 3 4 5
#include <iostream>
#include <vector>
int main() {
// 創(chuàng)建一個(gè)原始的 vector
std::vector<int> originalVector = {1, 2, 3, 4, 5};
// 使用拷貝構(gòu)造函數(shù)創(chuàng)建一個(gè)新的 vector,并初始化為原始 vector 的副本
std::vector<int> copiedVector(originalVector);//直接初始化
std::vector<int> copiedVector = originalVector;//拷貝初始化
// 修改新 vector 的第一個(gè)元素
copiedVector[0] = 100;
// 輸出原始 vector 的內(nèi)容
std::cout << "Original Vector: ";
for (int num : originalVector) {
std::cout << num << " ";//1 2 3 4 5
}
std::cout << "\n";
// 輸出新 vector 的內(nèi)容
std::cout << "Copied Vector: ";
for (int num : copiedVector) {
std::cout << num << " ";//100 2 3 4 5
}
return 0;
}
cv::Mat的拷貝和初始化
cv::Mat無論通過直接初始化還是拷貝初始化,新的copiedMat的內(nèi)存都和原始的originalMat相同;兩者增刪改查互相影響
-
對(duì)于函數(shù)中的傳值與引用,也都是淺拷貝,數(shù)據(jù)的改變也都會(huì)影響到源數(shù)據(jù)(即值傳遞方式傳遞對(duì)象給函數(shù)時(shí)用的是拷貝構(gòu)造函數(shù))
void A(cv::Mat image) void A(cv::Mat& image) 若要采用深拷貝,需要使用
originalMat.clone();
originalMat.copyTo(copiedMat4);
- clone()
和copyTo的區(qū)別:它們除了對(duì)不同的矩陣頭文件做不同的內(nèi)存操作外,最大的區(qū)別在于,clone()是復(fù)制一整個(gè)一模一樣的Mat,而copyTo(),可以使用mask選擇復(fù)制的范圍,A.copyTo(B,mask) - 以下例子
int main(){
// 創(chuàng)建一個(gè)原始的cv::Mat
cv::Mat originalMat = cv::Mat::eye(3, 3, CV_32F);//創(chuàng)建一個(gè)3x3的單位矩陣
cv::Mat copiedMat1(originalMat);//直接初始化
cv::Mat copiedMat2 = originalMat;//拷貝初始化
cv::Mat copiedMat3 = originalMat.clone();//使用cv::Mat的深拷貝函數(shù)
cv::Mat copiedMat4;
originalMat.copyTo(copiedMat4);//使用cv::Mat的深拷貝函數(shù)
// 修改原始的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]