从字符串向量中删除空元素
我正在尝试制作一个处理 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() 似乎会从列表中删除最后一个元素,而不是而不是删除这些空的部分。当我使用擦除()删除仅包含空格的行时,也存在同样的问题。
是否可以在保留 vLine 顺序的同时删除这些空元素?
(很抱歉在此没有使用迭代器。)
I'm attempting to make a small program that processes INI files, for use in a later project, first by reducing its size once loaded into memory. Thus,
where vLine is a vector containing the file contents
for (unsigned int i = 0; i < vLine.size(); i++)
{
if (!vLine[i].find(';', 0))
{
vLine[i].erase();
}
}
Upon printing vLine, I'll be left with spaces where once a line beginning with a semi-colon existed, such as
1.
2. property
3. property
4.
5. property
Using resize() appears to remove the last element from the list rather than remove these empty portions. The same problem exists where I remove lines that only contain whitespace with erase().
Is it possible to remove these empty elements while preserving the order of vLine?
(Apologies for not using iterators in this.)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这:
不会从向量中删除
vLine[i]
。表达式vLine[i]
返回对索引i
处元素的引用。因此,假设vLine
的类型为std::vector
,则函数调用erase()
实际上调用元素上的 string::erase()
,而不是向量上的vector::erase()
。您所做的就是将该特定元素留空。您可能想要的是这样的:
这实际上从向量中删除了元素。现在,这确实会使向量的所有当前迭代器无效,并且索引将不再正确。这是你真正需要使用迭代器的情况。
但还有一种更简单的方法:使用标准算法
std::remove_if( )
与函子,然后调用vLine.erase()
。如果你可以使用C++11编译器,那么你还可以使用lambda表达式来更加简洁。
This:
does not erase
vLine[i]
from the vector. The expressionvLine[i]
returns a reference to the element at indexi
. So assuming thatvLine
is of typestd::vector<std::string>
, the function callerase()
actually callsstring::erase()
on the element, notvector::erase()
on the vector. All you're doing is making that particular element blank.What you probably want is something like this:
This actually removes the element from the vector. Now, this does invalidate all current iterators to the vector, and the indices won't be right anymore. This is a situation where you really need to use iterators.
But there's an even easier way to do this: use the standard algorithm
std::remove_if()
with a functor then callvLine.erase()
.If you can use a C++11 compiler, then you can also use lambda expressions to be even more concise.
问题在于您删除元素的逻辑。当您遇到要删除的索引
i
处的元素时,您可以清除其值,但不会将其从向量中删除。执行您想要执行的操作的标准且简单的方法是 std::remove_if:
The problem is in your logic for removing the elements. When you come across an element at index
i
that you want to erase, you clear its value, but you do not remove it from the vector.The standard and simple way to do what you want to do is
std::remove_if
:使用擦除/删除习惯用法,最好使用 C++11 中的 lambda:
Use the erase/remove-idiom, preferably with a lambda from C++11:
使用 C++20,您可以使用 std::erase 这是相当于擦除-删除习惯用法。
With C++20 you can use std::erase which is equivalent to the erase-remove idiom.