删除向量中的字符串

时间:2012-02-02 23:22:38

标签: c++ string vector

我有一个充满字符串的向量

向量一致词包含4个字符串

  1. dedf
  2. EEDF
  3. FEDF
  4. hedf
  5. 现在我想要删除单词不以字母d

    开头的所有字符串

    然而它最终只是删除了eedf和hedf而我留下的结果是

    1. dedf
    2. FEDF
    3. 我的代码:

          for(int q=0; q<consistentWords.size(); q++)
          {
              string theCurrentWord = consistentWords[q];
              if(theCurrentWord[0] != 'd')
              {
                  consistentWords.erase(consistentWords.begin()+q);
              }
          }
      

      有什么想法?我只是不明白为什么它没有删除所有不以d开头的字符串。

6 个答案:

答案 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()
);