C++ 容器操作

1、容器的初始化、赋值

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

int main(int argc,char **argv)
{
	char *words[] = {"cat","birds","slog","mouse","pig","dog"};
	int len = sizeof(words)/sizeof(char*);
	vector<string> vs(words,words+len);//给vector容器赋值
	for(vector<string>::iterator iter = vs.begin(); iter != vs.end(); ++iter)
	{
		cout<<*iter<<endl;
	}

	cout<<"\n\n"<<endl;
	/**
	 * 将一个容器的指定内容赋值给另一个容器
	 * 迭代器标记出要复制的第一个元素和最后一个元素(最后一个元素是指超出数组末端的下一位置的指针)
	 */
	list<string> ls(vs.begin()+vs.size()/2 , vs.end());
	for(list<string>::iterator iter = ls.begin(); iter != ls.end(); ++iter)
	{
		cout<<*iter<<endl;
	}
	return 0;
}
C<T> c 创建一个空容器,适用于所有容器

C<T> c(c2) 创建c2的副本,c与c2必须具有相同的容器类型,并存放相同类型的元素,使用于所有容器

C<T> c(begin,end)  创建容器c, 其元素是迭代器begin和end标示的范围内元素的副本,适用于所有容器

C<T> c(n,t) 用n个值为t的元素创建容器c,只适用于顺序容器

C<T> c(n) 创建有n个值初始化元素的容器c ,只适用于顺序容器

使用默认初始化值时,元素类型必须是内置或复合类型,或者是提供了默认构造函数的类类型。如果元素类型没有默认构造函数,则必须显示指定其元素的初始化格式。


2、容器内元素的类型约束

(1)元素类型必须支持赋值运算。 所以没有元素是引用类型的容器。

(2)元素类型的对象必须可以复制。

这两个类型约束都可以从容器的定义出发,找到答案。


3、迭代器的范围

[ first , last )

它们指向同一个容器中的元素或超出末端的下一个位置

在容器中,first决不能位于last之后

while( firlst != last){
        //safe to use *first
        ++first;
}

4、顺序容器的操作

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

int main(int argc,char **argv)
{
	list<string> vs;
	string words;
	list<string>::iterator iter = vs.begin();
	while(getline(cin,words)){
		if(words.empty()){
			break;
		}
//		vs.push_back(words);
		iter = vs.insert(iter,words);//插入到链表头
	}
//	vs.insert(vs.end(),3,"yangjie");
	string array[4] = {"first","second","third","four"};
	vs.insert(vs.end(),array,array+4);//返回void,所以下一次使用迭代器之前必须初始化
	for(list<string>::const_iterator c_iter = vs.begin(); c_iter != vs.end(); ++c_iter)
	{
		cout<< *c_iter <<endl;
	}
	return 0;
}


5、容器元素的访问

c.back 返回容器c最后一个元素的引用

c.front 返回容器c第一个元素的引用

c[n]  vector && deque

c.at(n)  vector && deque

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

int main(int argc,char **argv)
{

	list<string> ls;
	string words;
	list<string>::iterator iter = ls.begin();
	while(getline(cin,words)){
		if(words.empty())
			break;

		iter = ls.insert(iter,words);
	}

	list<string>::reference rf = *ls.begin(); //取得第一个元素的引用
	cout<<rf<<endl;
	list<string>::reference rf2 = ls.front(); //取得第一个元素的引用
	cout << (rf == rf2) <<endl; // true
	list<string>::reference end = *--ls.end(); //取得最后一个元素的引用
	cout<<end<<endl;
	list<string>::reference end2 = ls.back(); //取得最后一个元素的引用
	cout<< (end == end2) <<endl; // true
	return 0;
}

6、删除元素

c.erase(p)   删除迭代器p所指的元素,返回一个迭代器,它指向被删除元素后面的元素

c.erase(b,e)

c.clear()

c.pop_back() 删除c的最后一个元素

c.pop_front() 删除容器c的第一个元素       只适用与list &&  deque

#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <algorithm>
using namespace std;

int main(int argc,char **argv)
{

	list<string> ls;
	string words;
	list<string>::iterator iter = ls.begin();
	while(getline(cin,words)){ //从标准输入读取字符串,每一次都插入到链表头
		if(words.empty())
			break;

		iter = ls.insert(iter,words);
	}

	cout<<"\n\n"<<endl;

	string searchValue("third");
	list<string>::iterator find_iter = find(ls.begin(),ls.end(),searchValue);//返回一个迭代器,指向具有指定值的第一个元素
	if( find_iter != ls.end()) //必须确保迭代器不是end迭代器
	{
		cout<< *find_iter <<endl; //对找到的指定值进行操作
	}

	ls.clear();//删除容器所有元素
	ls.erase(ls.begin(),ls.end());//同上
	return 0;
}

#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <algorithm>
using namespace std;

int main(int argc,char **argv)
{

	int ia[] = {1,2,3,4,5,6,7,8,9,10};
	int len = sizeof(ia)/sizeof(int);
	list<int> li(ia,ia+len);//把数组的值赋值给容器

	/**
	 * 删除list中的奇数
	 */
	/*
	for(list<int>::iterator iter = li.begin(); iter != li.end(); ++iter)
	{
		if((*iter) % 2)
		{
			iter = li.erase(iter); //这样也可以
		}
	}
	*/
	list<int>::iterator l_first = li.begin();
	while( l_first != li.end())
	{
		if((*l_first) % 2)
		{
			l_first = li.erase(l_first); //删除奇数,返回到指向下一个元素的迭代器
		}else{
			l_first++;//如果不是奇数,则指向下一个元素
		}

	}
	for(list<int>::iterator iter = li.begin(); iter != li.end(); ++iter)
	{
		cout<< *iter <<endl;
	}
	/**
	 * 删除vector中的偶数
	 */
	return 0;
}



7、vector自增长

#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <algorithm>
using namespace std;

void display(const vector<int>& vi)
{
	cout<< "size:"<<vi.size()<<"  "<<"capacity "<<vi.capacity()<<endl;
}
int main(int argc,char **argv)
{
	vector<int> vi;
	display(vi); //size:0  capacity 0 size是指容器中当前拥有元素的个数,capacity指在必须分配新的存储空间前可以存储的元素总数
	for(vector<int>::size_type sz = 0; sz != 24 ; sz++)
	{
		vi.push_back(sz);
	}
	display(vi);//size:24  capacity 32 一般编译器会指定一定的预留空间
	vi.reserve(50);//设置预留额外存储空间
	display(vi); //size:24  capacity 50
	while(vi.size() != vi.capacity())
	{
		vi.push_back(0);
	}
	display(vi);//size:50  capacity 50
	vi.push_back(1); //再添加一个元素,则需要重新分配内存了
	display(vi);//size:51  capacity 100
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值