一、vector拷貝順序
void copy (InputIterator first, InputIterator last, OutputIterator result); void copy_backward (BidirectionalIterator first, BidirectionalIterator last, BidirectionalIterator result);
在使用vector的拷貝函數之前,我們需要了解拷貝函數的兩個關鍵參數:源容器的迭代器和目標容器的迭代器。在進行拷貝時,需要指定源容器拷貝的迭代器區間,以及目標容器用於接收拷貝元素的迭代器。
copy函數用於將指定範圍內的元素拷貝到另一個容器中,源容器中的元素並不會被修改。copy_backward函數同樣也是將源容器中的元素拷貝到另一個容器中,但是是從後向前拷貝。
二、vector拷貝給另一個
std::vector vec1{1, 2, 3, 4, 5}; std::vector vec2(vec1);
通過使用vector的拷貝構造函數,我們可以將一個vector拷貝給另一個vector。拷貝構造函數會為新的vector分配內存空間並拷貝已存在的vector中的元素。需要注意的是,這裡是通過深拷貝完成的。
三、vector拷貝構造函數
vector (const vector& x); vector (const vector& x, const Allocator& alloc);
vector拷貝構造函數是vector類的一個構造函數,它允許我們創建一個新vector,它與現有的vector完全相同。需要注意的是,默認情況下,vector的拷貝構造函數也是使用深拷貝完成的。
四、vector拷貝一段數據給數組
std::vector vec{1, 2, 3, 4, 5}; int arr[vec.size()]; std::copy(vec.begin(), vec.end(), arr);
我們可以使用C++11提供的標準庫函數std::copy()函數將vector中的一段數據拷貝到一個數組中。需要注意的是,這並不是使用拷貝函數,而是使用了std::copy()函數。不過,由於vector的內存布局是連續的,因此它表現得與使用vector的拷貝函數相同。
五、vector拷貝構造
std::vector vec3(5, 10); std::vector vec4 = std::vector(vec3);
拷貝構造允許我們從一個vector中創建另一個vector。需要注意的是,這裡也是使用深拷貝完成的。
六、vector拷貝和複製
std::vector vec5{1, 2, 3, 4, 5}; std::vector vec6; vec6 = vec5; // 賦值 std::vector vec7(vec5); // 拷貝構造
C++允許我們使用賦值語句和拷貝構造函數來完成拷貝操作。需要注意的是,默認情況下,vector的拷貝構造函數和賦值運算符都是使用深拷貝完成的。
七、vector拷貝到數組
std::vector vec_f; vec_f.push_back(1.2f); vec_f.push_back(2.3f); vec_f.push_back(3.4f); float* data = vec_f.data(); // 拷貝到數組
我們可以使用vector的data()函數將vector中的數據拷貝到一個數組中。需要注意的是,通過data()函數所獲取到的數組與vector的內存布局是一致的,因此它表現得與使用vector的拷貝函數相同。
八、vector拷貝是深拷貝嗎
在涉及到從一個vector拷貝到另一個vector時,需要注意的是,vector默認使用深拷貝,這意味著拷貝的所有元素都是新的實例。不過,我們也可以通過顯式地使用淺拷貝完成拷貝。這一過程可以使用vector的std::swap()函數,或者手動迭代複製來完成。
九、vector拷貝到另一個vector
std::vector vec8{1, 2, 3, 4, 5}; std::vector vec9(5); std::copy(vec8.begin(), vec8.end(), vec9.begin());
vector的拷貝不僅僅可以完成向數組的拷貝,還可以完成向另一個vector的拷貝。我們可以使用std::copy()函數將源vector中的元素拷貝到目標vector中。
十、零拷貝的 IO Vector
零拷貝的IO Vector指向固定位置(linear memory space )的 vector,可以直接使用mmap將磁碟文件映射到vector的空間上,不需要複製數據,減少了數據拷貝等延遲。
#include #include #include #include #include bool LoadByteBufferFromFile(const std::string& file_path, std::vector* buffer) { int file_fd = open(file_path.c_str(), O_RDONLY); if (file_fd resize(file_stat.st_size); memcpy(buffer->data(), content_ptr, file_stat.st_size); munmap(content_ptr, file_stat.st_size); close(file_fd); return true; }
上述代碼演示了如何將一個文件讀取到內存中的vector變數上。在這個過程中,讀取的過程依據mmap實現零拷貝。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/293023.html