0

编辑:TLDR?这是一个摘要:

要求是一个基本上无限(或任意)长的容器。所以 list 听起来是个好主意,因为它可以将对象放在任何可用的内存空间中。

但是,向量在访问时要快得多/高效,但是如果我们没有长的顺序条带,则可能无法放入内存中。

建议使用指针向量来减少内存使用,但是如果有 1 GB 的指针并且我有 4GB 的内存,问题仍然存在,它可能不适合!

解决方案:向量列表可能是要走的路。列表中的每个项目都可以是一个向量,其中包含 1000 个指向我们希望能够访问的项目的指针。一个类可以处理这个功能。

**原始问题:**

正如一位智者所说:“有了指针,如果它只工作一次,那并不能保证你做对了。”

我有一堂课:

class A;

A 类在 std::list 中:

std::list<A> list_of_A;

要访问其中的项目,我正在使用:

std::list<A>::iterator iter = list_of_A.begin();
std::advance(iter, <an_unsigned_int>);
return *iter;

这似乎有效,但这样做是return *iter正确的吗?我应该提到最后 3 行是在一个函数中,它返回一个const A&

我在 stackoverflow 上寻找答案,但找不到这个问题的副本,这让我感到惊讶。

列表>矢量,因为我将在列表中交换东西。

4

2 回答 2

1

是的; 如果您的函数返回,您将在列表中返回一个引用,如果您的函数返回A&,则返回A const&一个副本A

但是,如果您经常这样做,为什么不使用std::vector? 它们具有随机访问迭代器,并且几乎总是比 a 更有效std::list,除非对象很大并且您拥有大量对象。std::list缓存效率很低。

于 2013-02-27T14:58:44.200 回答
1

只要您没有前进到(或过去)end(),这很好。

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;
}
于 2013-02-27T15:24:21.803 回答