STL 矢量擦除不起作用
STL Vector Erase Not Working
简而言之,我正在尝试编写一个例程,将文件中的逗号分隔值读取到stl向量中。这工作正常。csv 文件中的值也可能在双引号中,所以我也通过修剪它们来处理这个问题。但是,有一个问题,即引号之间的值也可能包含逗号,这些逗号不应被视为分隔符。
如果我有一个包含该行的文件
"test1","te,st2","test3","test4"
我的文件例程将其读入向量作为
"test1"
"te
st2"
"test3"
"test4"
我写了一个例程,我称之为PostProcessing。这将通过向量并纠正此问题。它将采用每个元素,并且检查第一个值是一个引号。如果是这样,它将删除它。然后,它将在字符串末尾查找另一个引号。如果它找到一个,它只会删除它并移动到下一个项目。如果它没有找到,它将继续遍历向量,将所有以下项目合并在一起,直到找到下一个报价。
但是,这适用于将"te 和 st2"合并到元素 2(索引 1)中,但是当我尝试从向量中删除所需的元素时,它一定失败了,因为生成的向量输出如下:
test1
test2
st2"
test3
"test4"
另请注意,最后一个元素尚未处理,因为我降低了计数的大小,但由于矢量擦除失败,真正的计数实际上并没有改变。
后处理代码如下。我做错了什么?
bool MyClass::PostProcessing()
{
bool bRet = false;
int nCount = m_vecFields.size();
for (int x = 0; x < nCount; x++)
{
string sTemp = m_vecFields[x];
if (sTemp[0] == '"')
{
sTemp.erase(0,1);
if (sTemp[sTemp.size()-1] == '"')
{
sTemp.erase(sTemp.size()-1, 1);
m_vecFields[x] = sTemp;
}
else
{
// find next double quote and merge these vector items
int offset = 1;
bool bFound = false;
while (x+offset < nCount && !bFound)
{
sTemp = sTemp + m_vecFields[x+offset];
if (sTemp[sTemp.size()-1] == '"')
{
// found corresponding "
sTemp.erase(sTemp.size()-1,1);
bFound = true;
}
else
{
offset++;
}
}
if (bFound)
{
m_vecFields[x] = sTemp;
// now remove required items from vector
m_vecFields.erase(m_vecFields.begin()+x+1, m_vecFields.begin()+x+offset);
nCount -= offset;
}
}
}
}
return bRet;
}
编辑:我发现了代码中的几个问题,我将纠正这些问题,但它们不会影响所提出的问题。
m_vecFields.erase(m_vecFields.begin()+x+1, m_vecFields.begin()+x+offset);
此函数采用半闭合间隔,这意味着要擦除的间隔的"结束"应指向最后一个要擦除的元素。在您的情况下,它指向该元素。将第二个参数更改为 m_vecFields.begin()+x+offset+1
。
x += offset;
由于您刚刚处理了一个项目并删除了下一项之前的所有内容,因此您不应在此处跳过offset
项目。循环中的x++
会做得很好。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- C++矢量 - 放置/擦除不起作用?(多态性)
- 擦除() 不起作用C++
- C++ std::set::擦除不起作用
- 如何通过长度从 std::vector 中删除元素<string>(擦除不起作用)
- 模板类矢量擦除不起作用
- 标准::列表::擦除不起作用
- STL 矢量擦除不起作用
- 对象的 C++ 向量,包含动态分配的内存 - "擦除"不起作用
- 矢量擦除函数不起作用 c++
- 排序、唯一、擦除不起作用
- 矢量排序和擦除不起作用
- C++映射擦除(开始,结束)不起作用
- 如何删除矢量中的元素。(擦除不起作用)
- 矢量上的擦除操作不起作用
- 迭代器擦除 (迭代器在先,迭代器最后) 在 Visual C++ 2010 Express 下不起作用
- 向量::擦除在类方法中不起作用,但在 main 中工作;没有编译器错误,只有意外的结果