如何有效地访问C ++中的列表信息?

时间:2016-01-20 18:12:20

标签: c++ list

我最初用Python制作了这个游戏,然后一个学校项目将它转换为C ++。

问题是C ++的std::list不允许我访问像Python list那样的项目(list[1])等等,访问列表中的列表项( list[2][5])。我无法找到一种有效的方法来做到这一点或替代可行的列表。

4 个答案:

答案 0 :(得分:12)

不要使用std::list。它实现了一个双向链表,它不提供下标运算符,因为链表的随机访问不能以恒定的复杂度实现。

相反,使用std::vector实现动态增长的数组并定义下标运算符。

@ShadowRanger发表评论时,您可能还会发现std::deque有用。它支持std::vector等恒定时间随机访问,但此外还可以在删除元素时自动释放存储。 (对于std::vector,您必须通过调用shrink_to_fit明确地执行此操作,这很容易走错方向。)当您需要在开头和结尾添加元素时,它也是优越的。但据我了解,您无论如何都不想更改容器中的元素数量。

另请注意Python和C ++之间的另一个区别。在Python中,如果你写

my_things = [1, 2, 3, 4]
your_things = [5, 6, 7]
our_things = [my_things, your_things]

然后your_thingsour_things[1]引用相同的列表。这是因为Python中的对象是引用引用的。另一方面,在C ++中,容器具有值语义。也就是说,如果你写

std::vector<int> my_things = {1, 2, 3, 4};
std::vector<int> your_things = {5, 6, 7};
std::vector<std::vector<int>> our_things = {my_things, your_things};

our_things将包含my_thingsyour_things副本,更改任何一个都不会影响另一个。如果这不是你想要的,你可以改为一次定义嵌套列表。

std::vector<std::vector<int>> our_things = {
  {1, 2, 3, 4},  // my things
  {5, 6, 7},     // your things
};

答案 1 :(得分:0)

您可以使用向量而不是列表。

答案 2 :(得分:0)

在C ++中,std :: list不支持通过operator []进行随机访问查找。如果要继续使用列表,则应该查看std :: advance函数。

list<string>::iterator itr = whichList.begin();
std::advance(itr, i);
if (itr->empty())
{
 /* ... assuming that you're testing for an empty string */
}

如果可能,您可能需要考虑其他标准容器,例如std :: vector或std :: deque,它们都通过operator []提供随机访问查找。

答案 3 :(得分:0)

如果您不需要更改列表的大小,可以使用普通数组。

这甚至可能是最快的选择。但只要不改变大小,std::vector的性能就相似。

相关问题