1. vector常用成员函数
vctor常用的成员函数,总结一下,方便应用,重要的是明白各个成员函数的参数和返回值,返回值尤其重要,且容易被忽略
vector容器类成员及成员方法 | 对应的含义与返回值 |
---|---|
vector::size_type | 一个无符号整数类型 |
vector::difference_type | 一个有符号整数类型 |
vector::iterator | 可变的随机类型迭代器类型,支持随机索引 |
vector::reverse_iterator | 用于逆向遍历的一种随机迭代器类型 |
iterator vector::begin() | 成员方法,返回一个vector容器首元素的迭代器 |
iterator vector::end() | 返回一个vector容器最后一个元素后面的迭代器 |
reverse_iterator vector::rbegin() | 返回被倒转的vector容器首元素的迭代器 |
reverse_iterator vector::rend() | 返回被倒转的vector容器尾元素的后面的迭代器 |
size_type vector::size() | 返回 vector容器中元素的个数(size_type)类型 |
bool vector::empty() | 判断vector容器是否为空,为空则返回true |
reference vector::operator[ ](size_type n) | 返回容器的第n个元素,返回的是元素的引用,可以修改其值,而且vector容器的下标类型是size_type类型 |
vector::vector(const vector &v) | 拷贝构造函数 |
vector ::vector(size_type n ,const T & x) | 构造函数,初始化一个含有 n个x的vector容器 |
void vector::swap(vector &v) | 将两个vector的内容互换 |
reference vector::front() | 返回第一个元素,引用形式 |
reference vector::back() | 以引用形式返回最后一个元素 |
void vector::push_back(const T& x) | 在vector尾部添加x |
void vector::pop_back() | 移除最后一个元素,无返回值 |
iterator vector::insert(iterator pos,const T&x) | 在pos位置之前插入元素x,返回指向这个元素的迭代器 |
void vector::insert(iterator pos,size_type n ,const T&x)) | 在pos位置插入n个x的复制品 |
InputIterator任意类型迭代器;void vector::insert(iterator pos,InputIterator f,InputIterator l) | 在pos之前插入[f,l) |
iterator vector::erase(iterator pos) | 删除迭代器pos位置处的元素,返回下一个元素的迭代器位置,如果删除最后一个元素,则会返回 vector::end()迭代器 |
void vector::clear() | 删除vector所有元素 |
2list常用成员函数
list 是双向链表,每一个节点都有相应的前驱与后继,可以从左到右,也可以从右到左
list容器除了具有和上面vector容器类似的成员方法外,它还有以下成员方法:
list容器额外的成员方法 | 方法的参数、返回值和意义 |
---|---|
void list::splice(iterator pos,list &x) | 将另外一个不同的list容器中的内容删除的同时插入到当前list容器的pos位置前,注意,当前容器与x容器必须为不同的链表容器 |
void list::splice(iterator pos,list &x, iterator i) | 将x容器中i位置的元素移到当前容器的pos位置前,x与当前容器可以为相同的容器 |
void list::splice(iterator pos, list &x,iterator f, iterator l) | 将x容器中[f,l)位置的元素移到当前容器的pos位置前 |
例子说明如下(主要看程序结果):
list<int> L1;
L1.push_back(2);
L1.push_back(0);
L1.push_back(1);
L1.push_back(9);
list<int> L2;
L2.push_back(8);
L2.push_back(8);
L2.push_back(8);
L2.push_back(8);
cout << "输出两个list中的内容到屏幕上" << endl;
cout << "L1 = ";
copy(L1.begin(), L1.end(), ostream_iterator<int>(cout," "));
cout << endl;
cout << "L2 = ";
copy(L2.begin(), L2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "将L2删除,并将其内容拷贝到L1的末尾" << endl;
cout << "L1 = ";
L1.splice(L1.end(),L2); //第一种形式的list::splic(iterator pos,list& x)
copy(L1.begin(), L1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
cout << "L2.size() = "<< L2.size()<<endl;
cout << "因为L2中元素已经删除(L2这个容器还存在),所以我们可以将L1中的首元素移到L2中" << endl;
//第二中形式的list::splice(iterator pos, list &x,iterator i)
cout << "将L1中首元素移到L2中后L2 = ";
L2.splice(L2.begin(),L1,L1.begin());
copy(L2.begin(), L2.end(), ostream_iterator<int>(cout, " "));//输出结果为2
cout << endl;
cout << "此时L1 = ";
copy(L1.begin(), L1.end(), ostream_iterator<int>(cout, " "));//因为已经将L1中的首元素2移到到了L2中,所以输出结果中没有2
cout << endl;
cout << "第三种形式的类似" << endl;
cout << "将L1中所有元素插入待L2首元素前面后L2 = ";
L2.splice(L2.begin(), L1, L1.begin(),L1.end());
copy(L2.begin(), L2.end(), ostream_iterator<int>(cout, " "));
cout << endl;
void list::remove(const T& val) | 从list容器中删除所有与val值相等的元素 |
---|---|
void list::remove_if (Predicate p) | Predicate p表示p是一个一元谓词(一元函数对象,类中重载了函数调用操作符()),即参数只有一个,且返回值是bool类型,移除所有使得p(*iterator)为true的元素 *iterator ,该成员方法的迭代器会自动遍历,来看看是否符合条件 |
list<int> L1;
L1.push_back(2);
L1.push_back(0);
L1.push_back(1);
L1.push_back(9);
class P
{
public:
bool operator()(int i)
{
if (i > 3)
{
return true;
}
return false;
}
};
P p;//函数对象,仿函数
L1.remove_if(p);//L1的迭代器iterator 会自动套用 p(*iterator), p(*iterator)的返回值为true,则删除该元素
//L1.remove_if(P());//产生的匿名函数对象
copy(L1.begin(), L1.end(), ostream_iterator<int>(cout, " "));
最后结果:删除了L1中大于3的元素9
void list::unqiue() | 移除等值元素所形成的相邻群组中第一个以外 的元素,一般要求list容器按顺序排列 |
---|---|
void list::unqiue(BinaryPredicate p) | 参数为二元谓词,有两个参数且返回值为bool类型的函数对象,移除list容器中所有的等值元素,不过这里的等值概念可以自己 通过二元谓词p来设计,只要使得 p(*iterator1,*iterator2) 返回值为true即可,一般也要求list容器按顺序排列 |
void list::merge(list & x) | 将两个已经排好序的lists合并,即删除x中的元素然后插入到该list中,插入过程还是按顺序找寻插入位置的 |
void list::reverse() | 逆转链表各元素的顺序,倒置 |
void list::sort() | 根据operator<将*this排序,排序算法是稳定的 |
void list::sort(BinaryPredicate comp) | 根据二元谓词的返回值是否为true来进行排序 |
class comp //仿函数,二元函数对象
{
public:
bool operator()(int & i,int &j)
{
if (i > j)//返回true,表示按降序排列
{
return true;
}
else
{
return false;
}
}
};
L1.push_back(2);
L1.push_back(0);
L1.push_back(1);
L1.push_back(9);
L1.push_back(6);
L1.push_back(10);
L1.push_back(5);
L1.push_back(3);
L1.sort();//默认升序排列
copy(L1.begin(), L1.end(), ostream_iterator<int>(cout, " "));
cout << endl;
L1.sort(comp()); //自己定义的二元谓词,降序排列
copy(L1.begin(), L1.end(), ostream_iterator<int>(cout, " "));
程序结果: