从矢量中删除具有特定字符串长度的元素

removing elements from vector with specific string length

本文关键字:字符串 元素 删除      更新时间:2023-10-16

我有一个以随机字符串作为元素的向量。我正在尝试循环查找长度不是 2 的字符串。如果它们的长度不是 2,则应将其从向量中删除。出于某种原因,我的代码没有删除所有长度不是 2 的字符串。

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

这是我的输出:河坳哈哈光盘英 孚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
}
}

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

这不是最好的解决方案,但你可以递减 i if 并且你的代码会起作用。

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

这是因为在你删除了"tom"之后,索引发生了变化。


在抹去"汤姆"之前

  • [0] "嗬"
  • [1] "奥">
  • [2] "汤姆">
  • [3] "哈哈">

  • [0] "嗬">
  • [1] "奥">
  • [2] "哈哈">
  • [3] "光盘">
  • 您可以通过减少 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;
}