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

时间:2011-12-05 01:46:10

标签: c++ string list

   list<string>&  whichList = theLists[ myhash( x, theLists.size( ) ) ];

我想知道如何访问某个位置说“我”并查看该位置是否为空。

我是这样做的:

if(whichList[i] == 0)

但它似乎没有起作用。

我意识到这是错误的。有什么建议吗?

4 个答案:

答案 0 :(得分:4)

您可以尝试以下方式:

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),尽管如果填写单个操作可能会很昂贵差距(这个想法是在很多操作上分摊成本,使操作顺序相对便宜)。

答案 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::vectorstd::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)

我认为你应该使用向量来解决这个问题。