gpt4 book ai didi

c++ - STL vector 删除不起作用

转载 作者:行者123 更新时间:2023-11-30 04:27:17 25 4
gpt4 key购买 nike

简而言之,我正在尝试编写一个例程,将文件中的逗号分隔值读取到 STL vector 中。这很好用。 csv 文件中的值也可能用双引号引起来,所以我也通过修剪它们来处理这个问题。但是,存在一个问题,即引号之间的值也可能包含不被视为分隔符的逗号。

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

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

我的文件例程将其读入一个 vector 中

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

我写了一个例程,我只是称之为 PostProcessing。这将通过 vector 并更正此问题。它将获取每个元素并检查第一个值是一个引号。如果是这样,它将删除它。然后它会在字符串的末尾寻找另一个引号。如果找到一个,它就会将其删除并移至下一个项目。如果没有找到,它将继续遍历 vector ,将以下所有项目合并在一起,直到找到下一条引述。

但是,这可以将“te 和 st2”合并到元素 2(索引 1)中,但是当我尝试从 vector 中删除所需的元素时,它一定会失败,因为生成的 vector 输出如下:

test1
test2
st2"
test3
"test4"

另请注意,最后一个元素尚未处理,因为我减少了计数的大小,但由于 vector 删除失败,因此真实计数实际上并未改变。

后处理代码如下。我做错了什么?

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++ 就可以了。

关于c++ - STL vector 删除不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11033506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com