Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这是访问列表中对象的正确方法吗?_C++_List - Fatal编程技术网

C++ 这是访问列表中对象的正确方法吗?

C++ 这是访问列表中对象的正确方法吗?,c++,list,C++,List,编辑:TLDR?这里是一个摘要: 该要求适用于基本上无限长(或任意长)的容器。所以这个列表听起来是个好主意,因为它可以将对象放在任何可用的内存空间中 然而,向量的访问速度更快/效率更高,但如果没有长的序列条,可能无法放入内存中 有人建议使用指针向量来减少内存使用量,但问题仍然存在,如果有1GB的指针,而我有4GB的ram,它可能就不适合 解决方案:一个向量列表可能是最好的选择。列表中的每个项目都可以是一个向量,其中包含1000个指向我们希望能够访问的项目的指针。类可以处理此功能 **原始问题:*

编辑: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;
}