C++ 这是访问列表中对象的正确方法吗?
编辑:TLDR?这里是一个摘要: 该要求适用于基本上无限长(或任意长)的容器。所以这个列表听起来是个好主意,因为它可以将对象放在任何可用的内存空间中 然而,向量的访问速度更快/效率更高,但如果没有长的序列条,可能无法放入内存中 有人建议使用指针向量来减少内存使用量,但问题仍然存在,如果有1GB的指针,而我有4GB的ram,它可能就不适合 解决方案:一个向量列表可能是最好的选择。列表中的每个项目都可以是一个向量,其中包含1000个指向我们希望能够访问的项目的指针。类可以处理此功能 **原始问题:** 正如一位智者曾经说过的:“对于指针,如果它只起一次作用,那并不能保证你做得正确。” 我有一门课:C++ 这是访问列表中对象的正确方法吗?,c++,list,C++,List,编辑:TLDR?这里是一个摘要: 该要求适用于基本上无限长(或任意长)的容器。所以这个列表听起来是个好主意,因为它可以将对象放在任何可用的内存空间中 然而,向量的访问速度更快/效率更高,但如果没有长的序列条,可能无法放入内存中 有人建议使用指针向量来减少内存使用量,但问题仍然存在,如果有1GB的指针,而我有4GB的ram,它可能就不适合 解决方案:一个向量列表可能是最好的选择。列表中的每个项目都可以是一个向量,其中包含1000个指向我们希望能够访问的项目的指针。类可以处理此功能 **原始问题:*
class A;
A类在std::列表中:
std::list<A> list_of_A;
std::列表A的列表;
要访问其中的项目,我正在使用:
std::list<A>::iterator iter = list_of_A.begin();
std::advance(iter, <an_unsigned_int>);
return *iter;
std::list::iterator iter=list_of_A.begin();
标准:先进国际热核实验堆;
返回*iter;
这似乎是可行的,但是return*iter
是正确的做法吗?我应该提到最后3行在一个函数中,该函数返回一个常量a&
我在stackoverflow上寻找答案,但找不到这个问题的副本,这让我感到惊讶
列表>向量,因为我将在列表中交换内容。是;如果函数返回
a&
或a常量&
,则返回列表中的引用;如果函数返回a
,则返回副本
但是,如果您经常这样做,为什么不使用
std::vector
?它们具有随机访问迭代器,并且几乎总是比std::list
更有效,除非对象很大,并且您拥有大量对象<代码>标准::列表的缓存效率非常低。只要您没有升级到(或超过)end(),这就很好
const A&stuff(std::list&list of A,int index)
{
assert(索引)正确,如果它工作为什么要问?指针:仅仅因为它工作一次并不意味着你做得正确。是的,但是如果你发现自己经常这样做,你可能更喜欢使用不同的数据结构。一个带有随机访问迭代器的结构,例如std::vector
。跨过一个列表就是O(N),以类似的方式访问向量的元素是常数时间。但是你说你有“超过500”项目。10^5比这个稍多。一个对象的大小是多少?@EdwardBird,他很担心,因为你似乎不知道自己在做什么。你不能使用与10^6元素相同的技术和数据结构来处理10^23个元素,这是行不通的。故意模糊。向量作为一个整体比猜测一下缓存大小。这取决于您是否也在使用自定义分配器。所以,如果我的对象是100字节,那就是“不大”?
const A& stuff(std::list<A>& list_of_A, int index)
{
assert(index <= list_of_A.size()); // Protect against UB
// of advancing past end.
std::list<A>::iterator iter = list_of_A.begin();
std::advance(iter, index);
if (iter == list_of_A.end())
{ throw std::runtime_error("Failed"); // Not allowed to de-reference end()
}
return *iter;
}