从特定字符串长度的向量中删除元素

时间:2018-03-07 23:52:20

标签: loops for-loop vector pop

我有一个随机字符串作为元素的向量。我试图循环查找不是长度为2的字符串。如果它们不是2的长度,那么它应该从向量中删除。出于某种原因,我的代码并没有删除所有不长度为2的字符串。

我尝试过单独删除元素,但是当它处于循环中时,它似乎不适用于元素。

这是我的输出: 浩 AO 大声笑 光盘 EF WQ 哟

并且预期输出不应包含字符串" lol"

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector <string> numbers = {"ho","ao", "tom", "lol", "cd", "ef", "wq", "hello","yo","sup","boi"};

// loop deletes string elements from vector that don't have length of 2
for(int i=0; i < numbers.size(); i++){
    if(numbers[i].length() != 2){
        numbers.erase(numbers.begin() + i); 
    }
}

// this makes sure the last element in vector gets deleted
if( numbers[numbers.size() - 1].length() != 2  )
    numbers.pop_back();


for(int i=0; i < numbers.size(); i++){
    cout << numbers[i] << endl; // prints out vector elements
}
}

2 个答案:

答案 0 :(得分:0)

当你第一次擦除时(在你擦除“tom”的情况下),下一个元素的id会减少,所以在下一次迭代中你不会检查“lol”的长度。

这不是最好的解决方案,但如果你的代码可以正常工作,你可以减少我。

if(numbers[i].length() != 2){
    numbers.erase(numbers.begin() + i);
    i--;
}

答案 1 :(得分:0)

这是因为在你擦除&#34; tom&#34;指数已经改变。

在删除之前&#34; tom&#34;

  • [0]&#34; ho&#34;
  • [1]&#34; ao&#34;
  • [2]&#34; tom&#34;
  • [3]&#34; lol&#34;
  • ...

  • [0]&#34; ho&#34;
  • [1]&#34; ao&#34;
  • [2]&#34; lol&#34;
  • [3]&#34; cd&#34;
  • ...

    您可以通过减少i来修复它;

if(numbers[i].length() != 2){
    numbers.erase(numbers.begin() + i);
    i--;
}

或者你可以这样做

for( auto i = numbers.begin(); i != numbers.end(); )
{
    if( i->length() != 2 ) i = numbers.erase(i); else ++i;
}