我正在尝试制作一个处理 INI 文件的小程序,以便在以后的项目中使用,首先是在加载到内存后减小其大小。因此,
其中 vLine 是包含文件内容的向量
for (unsigned int i = 0; i < vLine.size(); i++)
{
if (!vLine[i].find(';', 0))
{
vLine[i].erase();
}
}
在打印 vLine 时,我会留下空格,其中曾经存在以分号开头的行,例如
1.
2. property
3. property
4.
5. property
使用 resize() 似乎是从列表中删除最后一个元素,而不是删除这些空白部分。同样的问题存在于我使用erase() 删除仅包含空格的行。
是否可以在保留 vLine 顺序的同时删除这些空元素?
(很抱歉在此不使用迭代器。)
原文由 JGrey 发布,翻译遵循 CC BY-SA 4.0 许可协议
这个:
不会从向量中删除
vLine[i]
。表达式vLine[i]
返回对索引处元素的引用i
。 So assuming thatvLine
is of typestd::vector<std::string>
, the function callerase()
actually callsstring::erase()
on the element, notvector::erase()
在向量上。您所做的就是使该特定元素变为空白。你可能想要的是这样的:
这实际上从向量中删除了元素。现在,这确实使向量的所有当前迭代器无效,并且索引将不再正确。这是您真正需要使用迭代器的情况。
但是有一种更简单的方法可以做到这一点:使用标准算法
std::remove_if()
和仿函数,然后调用vLine.erase()
。如果你可以使用 C++11 编译器,那么你也可以使用 lambda 表达式来更加简洁。