STL 矢量擦除不起作用

STL Vector Erase Not Working

本文关键字:不起作用 擦除 STL      更新时间:2023-10-16

简而言之,我正在尝试编写一个例程,将文件中的逗号分隔值读取到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++会做得很好。