乐趣区

关于c++:C-STL-list删除元素

一、办法

函数 阐明
pop_front() 删除位于 list 容器头部的一个元素
pop_back() 删除位于 list 容器尾部的一个元素
erase() 该成员函数既能够删除 list 容器中指定地位处的元素,也能够删除容器中某个区域内的多个元素。
clear() 删除 list 容器存储的所有元素
remove(val) 删除容器中所有等于 val 的元素
unique() 删除容器中相邻的反复元素,只保留一份
remove_if() 删除容器中满足条件的元素

1、erase

格局 阐明
iterator erase (iterator position); 删除 list 容器中 position 迭代器所指地位处的元素
iterator erase (iterator first, iterator last); 删除 list 容器中 first 迭代器和 last 迭代器限定区域内的所有元素(包含 first 指向的元素,但不包含 last 指向的元素)

2、unique

格局 阐明
void unique() 去除 list 容器中相邻反复的元素
void unique(BinaryPredicate) 去除 list 容器中相邻反复的元素,仅保留一份

二、实例

这里次要是 unique()和 remove_if()的应用

1、unique()

 std::list<int> listInt1{16,72,72,100,72,109,203,671,109,192,671}, listInt2{9,201,94,43,67,81,901};

    **listInt1.unique();**
    int i = 0;
    std::list<int>::iterator listIter1 = listInt1.begin();
    for (; listIter1 != listInt1.end(); listIter1++)
    {std::cout << "unique listInt1[" << i++ << "]=" << *listIter1 << std::endl;
    }

后果如下:

由后果可知:
①只能比拟相邻两个元素,若间断三个或以上元素值雷同也实用

bool test(int first, int second)
{return (first <= second);
}


std::list<int> listInt1{72,73,100,72,44,48,109,92,671,15,192,671};

listInt1.unique(test);
int i = 0;
std::list<int>::iterator listIter1 = listInt1.begin();
for (; listIter1 != listInt1.end(); listIter1++)
{std::cout << "unique listInt1[" << i++ << "]=" << *listIter1 << std::endl;
}

后果如下:

由后果可知
当执行 test 返回 true 时,会删除元素
返回 false 时,会保留比拟的两个元素值
如:{72,73,100,72,44,48,109,92,671,15,192,671}的比拟步骤是
①72,73 返回 true,删除 73;72,100 返回 true,删除 100;72,72 返回 true,删除 72
②72,44 返回 false,保留 72,44
③44,48 返回 true,删除 48;44,109 返回 true,删除 109;44,92 返回 true,删除 92;44,671 返回 true,删除 671
④44,15 返回 false,保留 15
⑤15,192 返回 true,删除 192;15,671 返回 true,删除 671
因而最初 list 中的数据为 {72.44.15}
留神:
除了以上谓词函数的形式,还能够应用 lamba 表达式以及函数对象的形式定义。

2、remove_if

std::list<int> listInt1{72,73,100,72,44,48,109,92,671,109,15,671};

listInt1.remove_if([](int nValue) {return nValue < 100;});
int i = 0;
std::list<int>::iterator listIter1 = listInt1.begin();
for (; listIter1 != listInt1.end(); listIter1++)
{std::cout << "unique listInt1[" << i++ << "]=" << *listIter1 << std::endl;
}

或者

// 二元谓词函数
bool test(int nValue)
{bool bRet =  (nValue < 100);
    return bRet;
}

std::list<int> listInt1{72,73,100,72,44,48,109,92,671,109,15,671};

listInt1.remove_if(test);
int i = 0;
std::list<int>::iterator listIter1 = listInt1.begin();
for (; listIter1 != listInt1.end(); listIter1++)
{std::cout << "unique listInt1[" << i++ << "]=" << *listIter1 << std::endl;
}

后果如下:

大于等于 100 的元素值都会被保留

退出移动版