c++ - 如何访问 std::list<string> 中的某个元素

标签 c++ string list

   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) 操作,即在最坏情况下与列表的长度成线性关系。这是低效的,因此在界面中故意不支持它。

正如其他人指出的那样,如果您想要随机访问,那么您最好使用类似 vectordeque 的东西。一般来说,如果你只需要在容器的末尾快速插入/移除,你会使用一个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/

相关文章:

c++ - 测试类型是否为(智能)指针的通用方法

c++ - 按名称和国家/地区搜索的功能

java - 如果输入仅包含 1 和 0,则将其从二进制转换为十进制

java - 如何在 Java 代码中使用 scala.collection.immutable.List

List.add()期间发生java.util.ConcurrentModificationException

c++ - 为什么当我覆盖其他重载之一时,未覆盖的重载函数没有被继承?

python - tensorflow::Tensor 到 python Tensor 或 numpy.nd_array

c# - 用单个值替换所有出现的字符串(在数组中)

python - Python 会改变我的字节串吗?

c - 为什么函数必须返回 char * 而不是 char 数组?