Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何访问std::list中的某个元素<;字符串>;_C++_String_List - Fatal编程技术网

C++ 如何访问std::list中的某个元素<;字符串>;

C++ 如何访问std::list中的某个元素<;字符串>;,c++,string,list,C++,String,List,但它似乎不起作用 我意识到这是错误的。有什么建议吗?您可以尝试以下方法: if(whichList[i] == 0) list迭代器it=whichList.begin(); std::advance(it,i); 如果(*it==“”){/*…*/} 但我认为您需要清楚地定义此处“空”的含义-您不能将字符串与0进行比较 关键的一点是list不支持随机访问-由于它的实现(一个双链接列表),支持随机访问将是一个O(n)操作,即在最坏的情况下,列表的长度是线性的。这是低效的,因此故意在接口中不支

但它似乎不起作用


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

您可以尝试以下方法:

if(whichList[i] == 0)
list迭代器it=whichList.begin();
std::advance(it,i);
如果(*it==“”){/*…*/}
但我认为您需要清楚地定义此处“空”的含义-您不能将字符串与0进行比较

关键的一点是
list
不支持随机访问-由于它的实现(一个双链接列表),支持随机访问将是一个
O(n)
操作,即在最坏的情况下,列表的长度是线性的。这是低效的,因此故意在接口中不支持它

正如其他人所指出的,如果您想要随机访问,那么最好使用
向量
deque
之类的工具。一般来说,如果你只需要在容器的末端快速插入/删除,就可以使用<<代码>向量>代码>,如果你还需要在容器的前面快速插入/删除,并且只有在容器中间需要快速插入/删除的话,否则<>代码>列表<代码>。为了支持后一种类型的操作,
list
最终牺牲了对元素的随机访问

参见此处了解
advance
的定义,顺便提一下:


<>编辑:正如阿尔夫指出的,在某种程度上,可以使用间隙缓冲技术(C++)在向量的中间快速插入/移除,但是如果填充间隙,单个操作可能代价高昂(想法是在很多操作中使成本摊销,使操作序列相对便宜)。
std::list
不支持通过
操作符[]
进行随机访问查找。如果要继续使用列表,应查看
std::advance
函数

list<string> iterator it = whichList.begin();
std::advance(it, i);
if(*it == "") { /* ... */ }
list::迭代器itr=whichList.begin();
标准:预付款(itr,i);
如果(itr->empty())
{
/*…假设您正在测试一个空字符串*/
}

如果可能的话,您可能需要考虑其他标准容器,如<代码> STD::vector < /COD>或<代码> STD::DEQu</代码>,它们都提供了通过<代码>运算符[] /代码>的随机访问查找。p> 我认为应该使用向量来解决这个问题。

查找第一个值为空字符串的列表元素的标准方法是使用
std::find

list<string>::iterator itr = whichList.begin();
std::advance(itr, i);
if (itr->empty())
{
 /* ... assuming that you're testing for an empty string */
}
std::list::iterator it=std::find(whichList.begin(),whichList.end(),“”);

它的位置可以(昂贵地)计算为
std::distance(whichList.begin(),it)
,但不太可能需要实际的数字索引,假设您做出了一个简明的决定,即
std::list
是应用程序的正确容器类型。

您无法将
字符串
0
进行比较。你想在这里实现什么?你不能索引到
std::list
,你必须使用迭代器。我想你应该提出一个原因。因为他正在读取字符串的文本文件。你为什么要用一个列表?詹姆斯会更容易用向量吗?嗯,不完全是。
列表
支持(或曾经打算支持)高效拼接。您可以在连续数组中执行O(1)时间插入和删除操作,只需比移动元素(即光标间距技术)更智能一点,但不能在O(1)时间内拼接数组。不幸的是,当我回忆起C++03标准时,让每个编译器决定
列表
拼接复杂度,如果我没有记错的话,在C++11中,它被限制为线性时间。从原则上讲,消除这一问题是唯一的效率优势。哎哟另一个优点是
列表
不会失效太多。@Alf:谢谢,老实说,我还没有遇到光标间隙技术,我会去查一下的!过去我使用列表进行拼接,因为它可以是常数时间,并且保证不会比线性时间差。遗憾的是,在C++11中现在是线性时间。:)两者都是同时到达的。谢谢,很有意思。好吧,重新编辑,如果你设法填补空白,那么缓冲区就满了,需要一个新的更大的。类
向量
的间隙缓冲区会像类
向量
一样,将缓冲区大小增加一个因子,然后移动或复制到新的缓冲区。这并不是间隙缓冲区的额外成本,而是缓冲区完全填满时通常会发生什么(或者人们希望发生什么)。干杯
list<string>::iterator itr = whichList.begin();
std::advance(itr, i);
if (itr->empty())
{
 /* ... assuming that you're testing for an empty string */
}
std::list<std::string>::iterator it = std::find(whichList.begin(), whichlist.end(), "");