[英]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_things
和our_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_things
和your_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.