list<string>& whichList = theLists[ myhash( x, theLists.size( ) ) ];
我想知道如何访问某个位置说“我”并查看该位置是否为空。
我是这样做的:
if(whichList[i] == 0)
但它似乎没有起作用。
我意识到这是错误的。有什么建议吗?
答案 0 :(得分:4)
您可以尝试以下方式:
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),尽管如果填写单个操作可能会很昂贵差距(这个想法是在很多操作上分摊成本,使操作顺序相对便宜)。答案 1 :(得分:2)
在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 []
提供随机访问查找。
答案 2 :(得分:1)
查找值为空字符串的第一个列表元素的标准方法是使用std::find
:
std::list<std::string>::iterator it = std::find(whichList.begin(), whichlist.end(), "");
它的位置可以(昂贵地)计算为std::distance(whichList.begin(), it)
,但是你不太可能需要实际的数字索引,假设你已经做出了std::list
是正确的容器类型的有意识的决定为您的申请。
答案 3 :(得分:0)
我认为你应该使用向量来解决这个问题。