问题标签 [stdlist]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何从 std::list 中实现 O(1) 擦除
问题是推荐的std::list
用于实现 O(1) 擦除列表项的方法是什么?
通常,当我选择一个双向链表时,我希望能够在 O(1) 时间内从列表中删除一个元素,然后在 O(1) 时间内将其移动到另一个列表中。如果元素有自己的指针prev
和next
指针,那么完成工作就没有真正的技巧。如果列表是双向循环列表,则删除不一定需要知道包含该项目的列表。
根据迭代器失效规则,std::list
迭代器非常耐用。因此,在我看来,在我自己的项目上使用时我想要的行为std::list
是在我的类和包含列表中存储一个迭代器。
这有一个缺点,我需要创建自己的装饰版本std::list
,知道ref_
在将项目添加到列表时更新。我想不出一种不需要嵌入式迭代器的方法,因为没有迭代器意味着擦除会首先导致 O(n) 查找操作。
使用 O(1) 擦除的推荐方法是什么std::list
?或者,是否有更好的方法来实现目标?
过去,我通过实现自己的列表数据结构来实现这一点,其中放置在列表中的项目有自己的 next 和 prev 指针。管理这些指针是很自然的,因为它们是列表操作本身所固有的(我的列表实现的 API 会调整指针)。如果我想改用 STL,那么最好的方法是什么?我提供了嵌入迭代器的稻草人建议。有更好的方法吗?
如果需要具体的用例,请考虑使用计时器实现。创建计时器时,会将其放入适当的列表中。如果它被取消,则希望有效地删除它。(此特定示例可以通过标记而不是删除来解决,但它是实现取消的有效方法。)可根据要求提供其他用例。
我探索的另一种选择是将 astd::list
与 a融合std::unordered_map
以创建指针类型的专用列表。这是更重量级的(因为哈希表),但提供了一个非常接近接口级别的标准容器的容器,并且给了我 O(1) 的列表元素擦除。稻草人提案中唯一缺少的功能是指向当前包含该项目的列表的指针。我已经在CodeReview上提出了当前的实现以征求意见。
c++ - 并行 std::lists,根据列表 B 中项目的状态删除列表 A 中的项目?
我将如何完成以下任务?
列表 A 是一系列
Foo
s,列表 B 是一系列double
s,表示直到移除列表 A 的第 th 位置的剩余Foo
时间i
。也就是说,如果列表 B 中的双精度数小于零,则列表 A 中与列表 B 中小于零的Foo
双精度数相同的位置从列表 A 中删除,然后小于零的双精度数从列表 B 中删除.
我正在考虑类似于std::remove_if
List B 的内容,但是如果我这样做,我将如何删除 List A 的项目?可悲的是,不同列表的迭代器不兼容,并且除了使用手动实现之外,没有办法遍历列表并知道每个值的索引。
c++ - 是否可以将 std::list 作为 C++ 中结构的成员?
我将用一个例子来描述我的问题。我有结构三角形:
其中 mystruct 是:
可能吗?有没有可能出现的问题?
c++ - 迭代对列表,列表在数组中
我已经搜索了宇宙最远的地方(也就是互联网),但没有找到关于如何解决我的问题的任何提示。所以我来找你。
我正在尝试遍历包含字符串对的列表。此列表是数组中的 20 个列表之一。这是我当前的代码:
记录.h:
记录.cpp:
这个想法是,如果记录了一个重要性为 5 的事件,那么它将被放入列表 0、1、2、3 和 4。这样就可以在游戏中显示各种详细级别(如果控制台/日志打开),只需简单地显示对应于该详细级别的列表(由 displaylevel 定义)。但是我似乎无法正确遍历列表,它不断抛出不匹配的调用 std::basic_string 错误。任何帮助表示赞赏,我对 C++ 很陌生。
c++ - std::list 的迭代器中的分段错误
类声明
我有这个函数,它等待一个变量达到某个阈值,这是通过 pthread_cond 和 pthread_mutex 完成的。然后它返回。最后一行给出了分段错误。
pointers - 从带有对象的 std::list 中删除
我被教导在存储对象时总是使用指针列表,但我开始使用其中包含对象的列表。所以我想知道如何正确地从列表中删除一个对象?
第一个代码示例从指针列表中删除并且工作正常,但第二个代码示例在运行时出错。使用带有对象的列表时是否需要使用删除?
这样做有什么缺点和好处?
c++ - 如何从列表中随机定位 push_back()ed sprite - SFML?
我正在使用 C++ 中的 SFML 和 MS Visual Studio 10 制作这个基于空间的射击游戏。所以,我的敌人精灵在 std::list 中声明。为了让它们无限期地出现,我在列表中使用了大尺寸。但是,这会影响性能,并最终会在一段时间后终止。因此,我选择在每次删除一个元素时将一个元素 push_back() 放入列表中,以保持列表的大小不变并无限次生成敌人。这不会影响性能。然而,每次删除一个敌方精灵时,都会在位置 (0,0) 即左上角生成一个新的精灵。因此,为了在屏幕外随机生成它们的位置,我使用了相同的 RNG,用于在程序开始时初始化它们的位置。现在,它们是在屏幕外随机生成的,但整个列表正在被删除,并且正在再次生成一个新列表。这是我的代码:
显然,这是for循环。我正在迭代整个列表。如何更改它以便在只擦除一个元素时只生成一个元素?我应该设置什么条件?据我所知,我已经尝试了一切,但没有。请帮助我。
c++ - std::list 擦除(空闲内存)
析构函数的两种变体中的哪一种更快(为什么?)以释放内存:
memory-leaks - std::list 包含数百万从未添加的空对象
出于某种原因,我的 std::list 在我的程序执行过程中包含超过 1000000 个空对象(根据调试器)。
我在push_front()
and上设置了断点push_back()
,但它们都没有被调用 1000000 次,而我的实际代码只使用这两个函数。
恐怕我不知道要在这里复制什么代码 - 这是结果的实际位置System.AccessViolationException
,但是......好吧,我会复制任何人要求的任何代码。
调试器数据:
编辑:我将调试代码添加到Hypothesis::updateHypothesis(Update)
. 新函数读取
程序现在在调试线上崩溃了,我得到了
堆栈跟踪表明它正在崩溃::end()
。
c++ - 将两个单独的 std::list 相互绑定
好的,这是一个奇怪的问题,我不确定是否有解决方案。
我有两个列表,比如说一个客户列表和每个客户的一些数据列表。我有兴趣将这两个列表保存在两个单独std::list
的 s 中,因为我有一个用于提供 clients-list 的 API,但我不想连同它一起提供其余数据。
但是,由于两个列表应该相互对齐,即每个列表中的元素 n 应该引用同一个客户端,我正在寻找一种方法来链接它们,这样一个列表的元素就不能成为添加/删除而不添加/删除另一个列表中的相应元素,但出于我提到的 API 目的,仍将它们保留在两个单独的列表中。
有任何想法吗?