C++链接列表遗留代码到STL——在飞行中分配链表大小

C++链接列表遗留代码到STL——在飞行中分配链表大小,c++,linked-list,C++,Linked List,我正在编写一些遗留代码,这些代码定义了一个不使用STL容器的链表 我想转换这段代码以便使用STL列表。正如您在下面的示例中所看到的,链表为所有N指定了一个初始值。然后列表中的某些元素被分配了一些值。然后清除列表中的空元素 我正在寻找一种更好的方法来使用STL实现这一点。特别是,这种删除空元素的代码可以避免吗?我查看了STL文档。。它定义了一个remove方法,但这并不是我在这里需要的。有没有办法动态分配链表大小?谢谢你的建议 更新 我已经修改了代码。这类似于我的主代码。但是为了避免混淆,我在下面

我正在编写一些遗留代码,这些代码定义了一个不使用STL容器的链表

我想转换这段代码以便使用STL列表。正如您在下面的示例中所看到的,链表为所有N指定了一个初始值。然后列表中的某些元素被分配了一些值。然后清除列表中的空元素

我正在寻找一种更好的方法来使用STL实现这一点。特别是,这种删除空元素的代码可以避免吗?我查看了STL文档。。它定义了一个remove方法,但这并不是我在这里需要的。有没有办法动态分配链表大小?谢谢你的建议

更新 我已经修改了代码。这类似于我的主代码。但是为了避免混淆,我在下面编写了一个伪代码来解释它是如何工作的

台阶

将size ElementId分配给链表结构my_list 还有另一个链表meshElem,我对meshElem->elem struct中的一些值感兴趣。 例如:我需要elemId=meshelm->elem->id;此ElementMid的范围为0到ElementId。 elemId将被用作在struct my_list lst中查找特定元素的索引,例如lst[elemId] 在doSomething函数中,通过0循环到elementIds。在这个循环中,如果满足某些条件,lst->number将被分配一个整数值=someArray[i],其中i在appendElement中的范围为0到N 在struct my_list lst中没有下一个条目的元素被清除了问题:这可以避免吗? lst->number值在代码中进一步用于其他一些处理。 现在修改代码:


在您的逻辑中,与其在开始时创建所有节点,不如只运行一次循环,为true condition动态创建一个元素,并将其添加到列表中

for (i = 0; i<=N; i++)
{
    if ( i == foo(N) )
        node = createNode();
    appendElement(node);
}

在您的逻辑中,与其在开始时创建所有节点,不如只运行一次循环,为true condition动态创建一个元素,并将其添加到列表中

for (i = 0; i<=N; i++)
{
    if ( i == foo(N) )
        node = createNode();
    appendElement(node);
}
我想你只是想:

std::list<int> lst;

for (i = 0; i<=N; i++){        
    if ( i == foo(N) )
    lst.push_back(/*some new value*/);
}  
我想你只是想:

std::list<int> lst;

for (i = 0; i<=N; i++){        
    if ( i == foo(N) )
    lst.push_back(/*some new value*/);
}  

链表通常不使用连续内存,而是使用碎片化的堆分配节点。我想,如果为std::list构造函数提供初始计数,那么至少会有很多节点是连续的。除此之外,您还需要编写自己的分配器来使用std::list。

链表通常不使用连续内存,而是使用碎片化的堆分配节点。我想,如果为std::list构造函数提供初始计数,那么至少会有很多节点是连续的。除此之外,您还需要编写自己的分配器来使用std::list。

传统链表本质上是一个线程稀疏向量。带有null的数组是稀疏向量,链表提供线程。这两种方法相结合,可以对单个节点进行恒定访问,对数组进行随机访问,并对有效节点进行有效遍历,避免出现空值

假设这两个方面都很重要,并且假设数据可能比您显示的简单int更复杂,那么您可以创建一个数据结构,例如:

class ThreadedSparseVector {
private:
    std::vector<Data*> m_thread;
    std::vector<int> m_sparse_vector;
};
如果线程比随机访问更重要,那么另一种选择就是简单地使用STL映射。如果随机访问比线程更重要,那么您可以简单地使用STL向量并在迭代期间容忍空值,或者创建自动跳过空值的自定义迭代器


另一种选择,取决于您转换为STL的动机,是围绕实现STL兼容接口的遗留代码创建一个包装器,而不是将数据结构本身转换为使用STL。

遗留链表本质上是一个线程稀疏向量。带有null的数组是稀疏向量,链表提供线程。这两种方法相结合,可以对单个节点进行恒定访问,对数组进行随机访问,并对有效节点进行有效遍历,避免出现空值

假设这两个方面都很重要,并且假设数据可能比您显示的简单int更复杂,那么您可以创建一个数据结构,例如:

class ThreadedSparseVector {
private:
    std::vector<Data*> m_thread;
    std::vector<int> m_sparse_vector;
};
如果线程比随机访问更重要,那么另一种选择就是简单地使用STL映射。如果随机访问比线程更重要,那么您可以简单地使用STL向量并在迭代期间容忍空值,或者创建自动跳过空值的自定义迭代器


另一种选择,取决于您转换为STL的动机,是围绕实现STL兼容接口的遗留代码创建一个包装器,而不是将数据结构本身转换为使用STL。

我只希望这不是遗留代码,但是,你为这个问题做了些什么。AppEngEnter函数看起来是什么样子?考虑一下,如果i== Foon,Fo被定义为返回0或1……这将有助于展示Foo为Funt做些什么。
e图片因为现在看起来一开始就选择了错误的算法为什么需要精确的链表?我只是希望这不是遗留代码,但是,如果考虑到i==Fon,FoO被定义为返回0或1……这将有助于显示FO对于完整的图片的作用,因为现在它看起来像是错误的算法,首先选择了为什么需要链表?今天大家都弄错了?今天大家都弄错了的大括号是怎么回事?不,std::list对计数的构造函数没有这样的保证。不,std::list对计数的构造函数没有这样的保证。嗨,Jason,谢谢你的详细回答!在看你的答案之前,我已经更新了我的问题。数据是在这种情况下请参阅我的更新问题。所以我认为你的分析仍然有效。我会试试看。嗨,杰森,谢谢你详细的回答!在看你的答案之前,我已经更新了我的问题。数据是在这种情况下请参阅我的更新问题。所以我认为你的分析仍然有效。我要试一试。
void ThreadedSparseVector::appendElement(int i) {
    if (-1 == m_sparse_vector[i]) {
        // Add new data
        m_sparse_vector[i] = m_thread.size()
        m_thread.push_back(new Data(i));
    }

    Data* data = m_thread[m_sparse_vector[i]];
    // Initialize/update data as necessary
}