STL list

    技术2022-05-19  25

    一、概述 list是一个双向链表,空间不再连续,它的好处是每次插入或删除一个元素,就配置或释放一个元素空间。 list迭代器必须由能力指向list的节点,进行正确的递增,递减,取值,成员存取等操作。 List有一个重要的性质:插入(insert),接洽(splice) 和删除(erase)都不会造成原有的list迭代器失效。这在vector是不成立的,因为vector的插入操作可能造成记忆体重新配置,导致原来的迭代器全部失效。 slist是单链表,具有list同样重要的性质。根据STL习惯,插入操作将新元素插入指定位置之前,而非之后,然而作为一个单向链表,slist无法方便回头定为前一个位置,因此必须从头找起。除了slist的起点附近的区域外,在其他位置采用insert或erase操作函数都是不明智之举。为此,slist特别提供了insert_after和erase_after方法。

    二、插入元素    1.实例化一个整形list后,可以使用成员方法push_front把元素插在链表开头。      list listSID;       listSID.push_front(8);      listSID.push_front(11);      listSID.push_front(65);      // 65 11 8

       2.使用成员方法push_back把元素插在链表末尾。 

         list listSID;       listSID.push_back(8);      listSID.push_back(11);      listSID.push_back(65);      // 8 11 65      3.使用insert函数可以插入到任意位置,有三个重载版本      初始链表: 8 11 65      // a.指定位置插入值      listSID.insert(listSID.end(), 25); // 8 11 65  25      // b.在指定位置插入多个值      listSID.insert(vecArray.begin(), 2, 45); // 45 45  8 11 65  25      // c.Insert 2 elements from another container in position[1]      list listAnother(2, 30);      listSID.insert(listSID.end(), listAnother.begin(), listAnother.end());      // 45 45  8 11 65  25 45 45 三、删除元素          使用erase成员函数,有两个重载版本:一个是接手迭代器参数并删除迭代器指向的元素;一个是接受两个迭代器参数并删除指定范围内的所有元素。      list listSID;       list ::iterator it = listSID.push_back(8);      listSID.push_back(11);      listSID.push_back(65);      listSID.push_back(45);      listSID.erase(it);      // 11 65 45      listSID.erase(listSID.begin(), listSID.begin() + 2);      // 45 四、反转     list成员方法reverse()可以反转list元素的排列顺序     // 0 1 2 3     listSID.reverse()     // 3 2 1 0 五、排序       list成员方法sort()有两个版本:一个是没有参数,一个是接受一个二元谓词函数作为参数,将根据该谓词指定的标准进行排序。list默认是通过std:less调用运算符<对元素进行比较,以便将元素重新排序。当然也可以向list::sort提供一个二元谓词作为参数。二元谓词是一个函数,他接受两个输入值,并返回一个布尔值指出第一个值是否比第二个值小。   #include <list> #include <iostream> using namespace std; bool mySort(const int &lsh, int const &rsh) { return (rsh < lsh); } int main() { list <int> listSID; list <int>::iterator iter; listSID.push_back(8); listSID.push_back(11); listSID.push_back(65); listSID.push_back(45); listSID.sort(); for(iter=listSID.begin(); iter!=listSID.end(); iter++) { cout<<*iter<<endl; } cout<<"second sort"<<endl; listSID.sort(mySort); for (iter=listSID.begin(); iter!=listSID.end(); iter++) { cout<<*iter<<endl; } return 0; } 六、Q&A    1.list为何提供诸如sort和remove等成员函数      答:STL list类需要确保指向list中元素的迭代器始终有效,而不管如何在list中移动该元素。虽然STL算法也可用于list,但list的成员函数可确保list的上述特征即使将list排序后,指向list中元素的迭代器仍指向原来的元素。    2.使用存储People对象的list时,为让list的成员函数能够正常处理People对象,应该为People类实现哪些运算符?      答:必须为它实现默认比较运算符==和<。重载sort方法。  


    最新回复(0)