list<string>& whichList = theLists[ myhash( x, theLists.size( ) ) ];
我想知道如何访问某个位置说“i”并查看该位置是否为空。
我是这样做的:
if(whichList[i] == 0)
但它似乎不起作用。
我意识到这是错误的。有什么建议吗?
最佳答案
你可以尝试这样的事情:
list<string> iterator it = whichList.begin();
std::advance(it, i);
if(*it == "") { /* ... */ }
但我认为你需要在这里清楚地定义“空”的意思——你不能将字符串与 0 进行比较。
关键是 list
不支持随机访问 - 因为它的实现(双向链表),支持随机访问将是 O(n)
操作,即在最坏情况下与列表的长度成线性关系。这是低效的,因此在界面中故意不支持它。
正如其他人指出的那样,如果您想要随机访问,那么您最好使用类似 vector
或 deque
的东西。一般来说,如果你只需要在容器的末尾快速插入/移除,你会使用一个vector
,如果你还需要在前端快速插入/移除,一个deque
容器和 list
仅当您需要在容器中间快速插入/移除时。为了支持后一种操作,list
最终牺牲了对元素的随机访问。
advance
的定义见这里,顺便说一下:
http://www.sgi.com/tech/stl/advance.html
编辑:正如 Alf 指出的那样,您可以在某种程度上使用间隙缓冲技术(参见 http://en.wikipedia.org/wiki/Gap_buffer)在 vector 中间快速插入/移除,尽管如果您填补间隙,单个操作的成本可能很高(想法是分摊大量操作的成本,使操作序列相对便宜)。
关于c++ - 如何访问 std::list<string> 中的某个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8380195/