繁体   English   中英

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

[英]How do I effectively access list information in C++?

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

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

不要使用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
};

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

在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 []提供随机访问查找。

如果您不需要更改列表的大小,则可以使用plain array。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM