2014-03-27 36 views
3

我在C++下面的代碼:如何在C++中memcpy迭代器元素?

typedef struct 
{ 
    int age; 
    int roomNumber; 
} Student; 

Student student; 
student.age = 20; 
student.roomNumber = 10; 

vector<Student> studentV; 
student.push_back(student); 
student.push_back(student); 
student.push_back(student); 

Student student1[3]; 

int i; 

for(vector<Student>::const_iterator iterator = studentV.begin(); 
    iterator != studentV.end(); ++iterator,++i) 
{ 
    memcpy(&student1[i], iterator, sizeof(Student)); 
} 

它顯示了部分的memcpy以下消息:

error: cannot convert 'std::vector<Student>::const_iterator {aka __gnu_cxx::__normal_iterator<const Student*, std::vector<Student> >}' to 'const void*' for argument '2' to 'void* memcpy(void*, const void*, size_t)' 

這是什麼問題,如何解決?迭代器是不是可以像這樣複製?

+0

只要使用'的std :: copy'。 – chris

+1

一個迭代器不是一個指針..你可以通過迭代器(* iterator)得到*指向的值,然後得到它的地址'&(* iterator)'......還沒有真正嘗試過它。 – jsantander

回答

3

memcpy的第二個參數應該是地址Student對象,所以您應該使用&*iterator而不是iterator。由於運算符超載,這兩個不等價。 但我會建議不要使用memcpy

+0

爲什麼不使用memcpy?那麼要使用什麼? – ratzip

+0

使用'memcpy'結構複製是一種從C繼承的低級機制。在C++而不是循環中使用'std :: copy(studentV.begin(),studentV.end(),student1);'這是很多更簡單,並使許多錯誤不可能 - 例如在你的代碼中,'i'沒有被初始化,這會導致未定義的行爲,而使用'copy'時,你根本不需要任何'i'。 –

3

你想要做的就是複製迭代器引用的內容。使用*iterator來獲取迭代器引用的對象,並使用&來獲取其地址。順便說一句,不要使用memcpy但拷貝構造函數:

student1[i] = *iterator; 
0

使用std ::複製算法。如果對象是POD,它將使用普通內存複製例程(如memcpy),否則將使用複製構造函數。如果還可以保護您免於複製不可複製的對象(通過在編譯期間打印錯誤),代碼可能會執行的操作以及可能導致難以跟蹤錯誤的內容(如複製的不可複製對象內的雙重釋放)。

1

你應該利用的實際C++ 11級的設施和避免使用memcpy的所有:

#include <iostream> 
#include <vector> 
#include <array> 

typedef struct 
{ 
    int age; 
    int roomNumber; 
} Student; 

int main() { 
    Student student{ 20, 10 }; 
    std::vector<Student> studentV{ student, student, student }; 
    std::array<Student, 3> student1; 

    if (studentV.size() <= student1.size()) 
     std::copy(studentV.begin(), studentV.end(), student1.begin()); 
    for (const auto& s : student1) { 
     std::cout << s.age << " " << s.roomNumber << std::endl; 
    } 
}