c++ - 如何从另一个 vector/对象集构造一个新的 vector/指针集?

标签 c++ c++11 pointers vector set

背景

我想操作 vector 的拷贝,但是对其每个元素执行 vector 复制操作通常是昂贵的操作。

我在某处读到的称为浅拷贝的概念是默认的拷贝构造函数行为。但是我不确定为什么它不起作用,或者至少我尝试复制 vector 对象,结果看起来像一个深拷贝。

struct Vertex{
    int label;
    Vertex(int label):label(label){ }
};

int main(){
    vector<Vertex> vertices { Vertex(0), Vertex(1) };

    // I Couldn't force this to be vector<Vertex*>      
    vector<Vertex> myvertices(vertices); 

    myvertices[1].label = 123;

    std::cout << vertices[1].label << endl; 
    // OUTPUT: 1 (meaning object is deeply copied)

    return 0;
}

朴素的解决方案:用于指针复制。

int main(){
    vector<Vertex> vertices { Vertex(0), Vertex(1) };

    vector<Vertex*> myvertices;
    for (auto it = vertices.begin(); it != vertices.end(); ++it){
        myvertices.push_back(&*it);
    }

    myvertices[1].label = 123;

    std::cout << vertices[1].label << endl;
    // OUTPUT: 123 (meaning object is not copied, just the pointer)

    return 0;
}

改进

是否有任何其他更好的方法或 std::vector API 来构建一个包含原始 vector 中每个元素的指针的新 vector ?

最佳答案

您可以将元素 vector 转换为指向原始 vector 元素的指针 vector 的一种方法,与您的示例相比,这种方法在效率方面更好,因为它预先分配了 vector 的缓冲区指针,恕我直言,更优雅的是通过使用 std::transform 如下:

std::vector<Vertex*> myvertices(vertices.size());
std::transform(vertices.begin(), vertices.end(), myvertices.begin(), [](Vertex &v) { return &v; });

Live Demo

或者如果您不想对一元运算符使用 lambda:

std::vector<Vertex*> myvertices(vertices.size());
std::transform(vertices.begin(), vertices.end(), myvertices.begin(), std::addressof<Vertex>);

Live Demo

注意:如果您更改了原始 vector ,则会使指针 vector 中的指针无效。

关于c++ - 如何从另一个 vector/对象集构造一个新的 vector/指针集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39088533/

相关文章:

c++ - 禁用 QTabBar 中的辅助滚动按钮(撕裂指示器?)

c++ - lambda 可以是类固有的吗

c++ - 如何将 std::function 从 Objective-C++ 传递到 C++ 方法

c - 将多维数组作为指针传递给函数

c# - 平台调用、 bool 值和字符串

c++ - 如何在类 noexcept 之外定义默认构造函数?

c++ - 如何在 C++ 中使用默认模板参数显式实例化类?

c++ - 使用另一个指针在 `delete` 拥有的对象上调用 `unique_ptr`

c - 字符指针数组打印垃圾

c++ - 解释以下 C++ 程序的输出