【问题标题】:how to memcpy iterator element in C++?如何在 C++ 中 memcpy 迭代器元素?
【发布时间】:2014-03-27 13:58:50
【问题描述】:

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

问题是什么以及如何解决?难道迭代器就不能这样复制了吗?

【问题讨论】:

  • 只需使用std::copy
  • 一个迭代器不是一个指针..你可以得到迭代器(*iterator)的值pointed然后得到它的地址&amp;(*iterator)...还没有试过了。

标签: c++ vector iterator memcpy


【解决方案1】:

memcpy 的第二个参数应该是Student 对象的地址,所以你应该使用&amp;*iterator 而不是iterator。由于运算符重载,这两者并不等效。 但我建议不要使用memcpy

【讨论】:

  • 为什么不使用 memcpy?那用什么?
  • 使用memcpy 进行结构复制是一种从C 继承的低级机制。在C++ 中,使用std::copy(studentV.begin(), studentV.end(), student1); 而不是循环,这更简单,并且不可能出现许多错误——例如在你的代码 i 未初始化,这将导致未定义的行为,而使用 copy 您根本不需要任何 i
【解决方案2】:

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

student1[i] = *iterator;

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      使用 std::copy 算法。 如果对象是 POD,它将使用普通内存复制例程(如 memcpy),否则将使用复制构造函数。 If 还可以防止您复制不可复制的对象(通过在编译期间打印错误),您的代码可能会执行某些操作并且可能导致难以跟踪的错误(例如复制的不可复制对象内部的双重释放)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-21
        • 2021-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多