我有一个充满字符串的向量
向量一致词包含4个字符串
现在我想要删除单词不以字母d
开头的所有字符串然而它最终只是删除了eedf和hedf而我留下的结果是
我的代码:
for(int q=0; q<consistentWords.size(); q++)
{
string theCurrentWord = consistentWords[q];
if(theCurrentWord[0] != 'd')
{
consistentWords.erase(consistentWords.begin()+q);
}
}
有什么想法?我只是不明白为什么它没有删除所有不以d开头的字符串。
答案 0 :(得分:3)
您正在跳过元素。假设您需要删除元素5,6:
当你删除元素5时,元素6变成元素5 - 你跳过它,因为q
增加到6,
更好的方法是仅在不删除元素时手动增加q
答案 1 :(得分:3)
首先,字符串对应于这些索引:
dedf 0
eedf 1
fedf 2
hedf 3
假设你删除了eedf
(所以q == 1
。删除后,矢量看起来像
dedf 0
fedf 1
hedf 2
然后q
增加到2,完全跳过fedf
。修复方法是稍微改变for
循环:
for(int q=0; q<consistentWords.size();)
{
string theCurrentWord = consistentWords[q];
if(theCurrentWord[0] != 'd')
{
consistentWords.erase(consistentWords.begin()+q);
}
else
{
q++;
}
}
或具有同样效果的东西。
答案 2 :(得分:2)
当你擦除时,你不应该做q ++。那你错过了一个元素。
答案 3 :(得分:2)
问题是您是在向量中删除元素并在同一次迭代中递增索引q
。因此,在for循环的第二次迭代中,从向量中删除"eedf"
,然后向量为["dedf", "fedf", "hedf"]
和q = 1
。但是当你循环回到for循环的开头时,q
会增加到2,所以你看下一个"hedf"
,跳过"fedf"
。要解决此问题,您可以在从数组中删除元素时递减q
,如下所示:
for(int q=0; q<consistentWords.size(); q++)
{
string theCurrentWord = consistentWords[q];
if(theCurrentWord[0] != 'd')
{
consistentWords.erase(consistentWords.begin()+q);
--q;
}
}
或者您可以使用迭代器:
vector<string>::iterator it = consistentWords.begin()
while(it != consistentWord.end())
{
string theCurrentWord = consistentWords[q];
if(theCurrentWord[0] != 'd')
{
it = consistentWords.erase(it);
}
else
{
++it;
}
}
请注意,erase
会在您删除的元素之后返回元素的迭代器。您必须重新分配it
,因为它会在调整矢量大小时失效。
答案 4 :(得分:1)
问题已得到解答,但您应该查看Erase-remove idiom:
示例:
consistentWords.erase(
std::remove_if(consistentWords.begin(), consistentWords.end(),
[](const std::string& s) -> bool { return (s[0] == 'd'); }),
consistentWords.end());
答案 5 :(得分:0)
删除单词:
consistentWords.erase(
std::remove(consistentWords.begin(), consistentWords.end(), theCurrentWord),
consistentWords.end()
);