STL矢量擦除不起作用

时间:2012-06-14 12:56:17

标签: c++ stl vector

简单地说,我正在尝试编写一个例程,将文件中的逗号分隔值读入stl向量。这很好用。 csv文件中的值也可能是双引号,所以我也通过修剪它们来处理它。但是,有一个问题,即引号之间的值也可能包含逗号,这些逗号不应被视为分隔符。

如果我有一个包含该行的文件

"test1","te,st2","test3","test4"

我的文件例程将其读入矢量

"test1"
"te
st2"
"test3"
"test4"

我写了一个例程,我刚才叫做PostProcessing。这将通过向量并纠正此问题。它需要每个元素并检查第一个值是否为引号。如果是这样,它将删除它。然后它会在字符串的末尾查找另一个引号。如果它找到一个它只会删除它并移动到下一个项目。如果它没有找到一个,它将继续通过向量合并所有以下项目,直到它确实找到下一个引用。

然而,这可以将“te和st2”合并到元素2(索引1)中,但是当我尝试从向量中擦除所需的元素时,它必须失败,因为结果向量输出如下:

test1
test2
st2"
test3
"test4"

另请注意,最后一个元素尚未处理,因为我对计数的大小进行了处理,但由于向量擦除失败,真正的计数实际上没有改变。

PostProcessing代码如下。我做错了什么?

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;
}

编辑:我发现了一些代码问题,我将对其进行更正,但这些问题不会影响被问到的问题。

1 个答案:

答案 0 :(得分:2)

m_vecFields.erase(m_vecFields.begin()+x+1, m_vecFields.begin()+x+offset);

此函数采用半闭区间,这意味着要擦除的区间的“结束”应指向要擦除的最后一个元素的一个。在您的情况下,它指向该元素。将第二个参数更改为m_vecFields.begin()+x+offset+1

x += offset;

由于您刚刚处理了一个项目并删除了下一个项目的所有内容,因此您不应在此处跳过offset个项目。循环中的x++会很好。