停止覆盖向量中的地址?

问题描述 投票:0回答:1

我的问题如下。我有一个向量类 elementList,其中包含沿表面描述三角形的元素,但是当我通过 emplace_back 将单独构造的元素添加到 elementList 中时,它们的地址会发生变化。

如果您需要更多代码,请告诉我,但我删除了多余的内容以获取我认为必需的内容。第一个元素列表:

class elementList
{
public:
    elementList(std::string filename);

    std::vector<element> const& get_elements() const;

private:
    std::vector<element> m_elements;
};

我将源 txt 文件中的信息解析到其中。元素类,排除一些不必要的位,看起来像这样

class element
{
public:

    element(float x11, float x12, float x21, float x22, float x31, float x32); 

    std::vector<Node> const& nodes() const;
    std::vector<Edge> const& edges() const;
        [...]
    
private:

    std::vector<Node> m_nodes;
    std::vector<Edge> m_edges;
    [...]
};

所以我在构造 elementList 时解析源文件

elementList::elementList(std::string filename)
{
        [...] //parse node coordinates from source file

        m_elements.emplace_back(element(x11,x12,x21,x22,x31,x32)); //1
}

构建工作正常,但令我惊讶的是元素中顶级变量的地址发生了变化。如果例如在元素构造函数中我打印出来

element::element(float x11, float x12, float x21, float x22, float x31, float x32)
{
        [...]
        std::cout << &m_nodes[0] << std::endl;
}

我得到的地址与在 elementList 构造函数中并打印出来时不同

elementList::elementList(std::string filename)
{
        [...]
        m_elements.emplace_back(element(x11,x12,x21,x22,x31,x32)); //1
        Node initialNode = m_elements.at(0).nodes().at(0);
        std::cout << &initialNode;
}

所有元素都会发生这种情况,只有地址发生变化,节点值没有变化。有没有办法将元素追加到 elementList 并保持相同的内存地址?否则,这会丢失我存储在每个单独元素中的一些连接信息。

我的猜测是在步骤//1处代码实际上复制了元素而不是按原样插入它,有没有办法避免这种情况?

c++ pointers constructor stdvector c++98
1个回答
0
投票

std::vector
添加元素可能会导致重新分配,从而使其元素的指针无效。

您可以使用

std::deque
代替。在
std::deque
的末尾添加和删除元素不会使指针无效。

© www.soinside.com 2019 - 2024. All rights reserved.