如何在c++中记忆迭代器元素



我在c++中有以下代码:

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)'

问题是什么?如何解决?迭代器不能像这样复制吗?

memcpy的第二个参数应该是Student对象的地址,所以应该使用&*iterator而不是iterator。由于操作符重载,这两个是不等价的。但是我建议不要使用memcpy

你要做的就是复制迭代器所指向的内容。使用*iterator获取迭代器引用的对象,使用&获取其地址。顺便说一下,不要使用memcpy,而是使用复制构造函数:

student1[i] = *iterator;

您应该充分利用实际的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;
    }
}

使用std::copy算法。如果对象是POD,它将使用普通内存复制例程(如memcpy),否则将使用复制构造函数。它还将保护您避免复制不可复制的对象(通过在编译期间打印错误),您的代码可能会这样做,并且可能导致难以跟踪的错误(如复制的不可复制对象中的double free)。

最新更新