C++顺序容器学习小结

C++顺序容器

一、 C++数组的描述

一维数组的动态内存分配:

Int *num=new int[len];

delete []num;

二维数组的动态内存分配:

1、知第二维

char (*num)[N];//指向数组的指针

num = newchar[m][N];

delete[]num;

2、知第一维

char*num [M];//指针的数组

for(int i=0; i<M; i++)

num[i] = new char[n];

for(i=0; i<M; i++)

delete[]num [i];

delete[]num;

3、已知一维 分配内存(保证内存的连续性)

char*num [M];//指针的数组

num [0] = new char[M*n];

for(int i=1; i<M; i++)

num [i] = num [i-1] + n;

delete[] a[0];

4、两维都未知

char** num;

num = new char* [m];//分配指针数组

for(int i=0; i<m; i++)

num[i] = new char[n];

for(i=0; i<m; i++)

delete[]num [i];

delete[]num;

5、两维都未知,一次分配内存(保证内存的连续性)

char ** num;

num = new char* [m];

num [0] = new char[m * n];//一次性分配所有空间

for(int i=1; i<m; i++)

num[i] = num [i-1] + n;//分配每个指针所指向的数组

delete[]num [0];

delete[]num;

二、 C++容器类型

Vector 可变大小数组 随机访问方便

Deque 双端队列 随机访问方便

List 双向链表 容器中间插入删除很方便 如果有很多的小元素 额外开销很严重

Forward_list 单向链表 容器中间插入删除很方便 如果有很多的小元素 额外开销很严重

Array 固定大小数组

String 用以保存字符串

容器的操作:

1、向容器中添加元素:

push_back---除了array和forward_list以外,push_back从尾部添加一个元素;

push_front==list、forward_list、deque容器支持push_forward将元素从头插入;

intsert—vector ,string,list,deque都支持insert成员,forward_list支持特殊的insert。

emplace—新标准引入三个成员,,emplace_front,emplace,emplace_back是构造而不是拷贝元素,

2、在顺序容器中访问元素的操作:

Vector<string>c;

c.back();//返回c中尾部的引用,若c为空,函数行为未定义;

c.front();//返回c中头部的引用,若c为空,函数行为未定义;

c[n];

c.at(n);//返回下标为n的引用,如果下标越界,则标出异常

注意:at操作只是适用于string vector deque array操作;back不适用与forward_list.

3、删除操作:

Vector <string>c;

c.push_back();

c.push_front();

c.erase(p);

c.erase(b,e);

c.clear();

注意:删除元素的成员函数不检查其参数,在删除之前,必须保证它们存在。

4、(单向链表)forward_list的特殊使用{插入删除操作}

Forward_list<int>fist;

fist.before_begin()

fist.cbefore_begin();

fist.insert_after();

emplace_after();

fist.erase_after();

5、改变容器大小

C.resize(n);

C.resize(n,t);

6、管理容量的成员函数

Vector<string> c;

c.shrink_yo_fit);只适用于vector string deque,将capacity()减少为size()的大小。

c.capacity();不重新分配内存的情况下 可以存贮多少元素

c.reserve(n);分配至少能容纳n的内存空间。

7、容器适配器

size_type – 一种类型,足以保存当前类型的最大值

value_type—元素类型

container_type—实现适配的底层类型

示例代码如下:

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){
	/*//容器的定义以及初始化
	//一个容器拷贝到咯、另一个容器
	list<string> str({"fht","hjs","hut"});
	vector<const char*> str1("a","b","bcx");
	//拷贝
	forward_list<string> words(str1.begin(),str1.end());
	deque<string> nu(str.begin(),it);
	//使用assign赋值(仅适用于顺序容器)
	str.assign(str1.cbegin(),str1.cend());
	//使用swap交换两个相同的容器
	vector<string> a1(10);
	vector<string> a2(24);
	swap(a1,a2);
	//从尾部加入元素
	string word;
	vector<string> contains;
	while(cin>>word){
		contains.push_back(word);
	}
	//从头部插入元素
	list<string> li1;
	while(cin>>word){
		li1.push_front(word);
	}
	//从容器的特定位置插入
	vector<string> v2;
	list<string> li2;
	li2.insert(li2.begin(),"hello");
	li2.insert(v2.begin(),"hello");//vector虽然不支持从头部插入但是可以用这种方式插入,但是这样速度会很慢
	//forward_list的使用
	forward_list<string> fist={1,23,4,5,6,6,7,7,8,8,8,665,56,789,6,6,5,5,99,65,78};
	auto one=fist.before();//目前元素
	auto two=fist.begin();
	while(curr!=fist.end()){
		if(*curr%2)
			curr=fist.erase_after(one);
		else
			one=curr;
		++curr;
	}*/ 

	//管理容量成员函数
	vector<int> num;
	cout<<"size()="<<num.size()<<endl;
	cout<<"capacity()="<<num.capacity()<<endl;
	for(vector<int>::size_type i=0;i!=40;i++){
		num.push_back(i+23);
	}
	cout<<"size()新1="<<num.size()<<endl;
	cout<<"capacity()新1="<<num.capacity()<<endl;
	num.reserve(90);
	cout<<"size()新2="<<num.size()<<endl;
	cout<<"capacity()新2="<<num.capacity()<<endl;
	//如果在添加数据,又应该什么变化呢?
	for(int i=0;i<60;i++)
			num.push_back(67+i);
	num.insert(num.begin(),12334);
	cout<<"添加后size()="<<num.size()<<endl;
	cout<<"添加后capacity()="<<num.capacity()<<endl;
	//将分配超出的内存归还内存
	num.shrink_to_fit();
	cout<<"size()="<<num.size()<<endl;
	cout<<"归还后capacity()="<<num.capacity()<<endl;
	//读取vector中数据
	cout<<"容器里的数据是:";
	for(int i=0;i<num.size();i++){
		cout<<num[i]<<" ";
	} 

	//string 的额外操作
	const char *cp="Hello world!";
	char noNull[]={'h','i'};
	string s1(cp);
	string s2(cp,6,20);
	cout<<s1<<" "<<s2<<" "<<endl;
	string s("Hello world!");
	string s3=s.substr(0,7);
	s.insert(s.size()-2,5,'?');
	cout<<s<<" "<<endl;
	s.erase(s.size()-5,5);
	cout<<s<<" "<<endl;
	//assgin方法
	s.assign(cp,13);
	cout<<s<<" "<<endl;
	//append方法
	s2.append(" ffh,sbx fy and fy");
	cout<<s2<<" "<<endl;
	s2.replace(11,4,"ffh,sbx");
	cout<<s2<<" "<<endl;
	//string搜索操作
	string name("anfsdkjhgjs dfngndfmgnd sdghsdfjg"),nu("dhfhj");
	auto posl=name.find("js");//全部匹配
	cout<<posl<<endl;
	auto po=nu.find_first_of(name);//任意一个匹配
	cout<<po<<endl;

	system("pause");
	return 0;
}

(全文完)

时间: 2025-02-01 16:46:58

C++顺序容器学习小结的相关文章

c++ 顺序容器学习

所谓容器,就是一个装东西的盒子,在c++中,我们把装的东西叫做“元素” 而顺序容器,就是说这些东西是有顺序的,你装进去是什么顺序,它们在里面就是什么顺序. c++中的顺序容器一共有这么几种: vector 可变大小数组 deque 双端队列 list 双向链表 forward_list 单向链表 array 固定数组大小 string 与vector相似的容器,但专门用于保存字符 这些容器可以让我们方便地放元素,取元素,but,她们在:添加.删除.非顺序访问,这些方面的性能都是不同滴(根据需要适

c++ 顺序容器学习 - 容器适配器

摘要: 对 容器适配器 的疑问. 刚开始接触 容器适配器 时,总感觉怪怪的,认为多此一举,顺手搜了搜,原来我在这一点is not alone: STL容器适配器的用途 其中有个老兄说的好,这里 引用一下: 1 adapter原意是插座.适配器.接合器的意思.现在我需要一个栈结构,我们可以用deque来实现,只在一端进行元素插入和弹出,另一端不动.这说明deque可以用作一个栈结构,但它又不能直接地严格地满足你的要求,因为你不能防止别人在另一端乱动你的东西.你需要对它进行一些包装,作一些限制,使之

Accelerated C++学习笔记7—&lt;使用顺序容器并分析字符串&gt;

第6章  使用库算法 本章中主要教我们如何使用几个库算法来解决与处理字符串和学生成绩相关的问题. 1.分析字符串 使用一个循环来连接两幅字符图案 for(vector<string>::const_iterator it = bottom.begin(); it != bottom.end(); ++it) ret.push_back(*it);</span> 等价于 ret.insert(ret.end(), bottom.begin(), bottom.end());</

C++学习之顺序容器(一)

一个容器就是一些特定类型对象的集合.顺序容器(sequential container)为我们提供了控制元素存储和访问顺序的能力.这种顺序不依赖于元素的值,而是与元素加入容器时的位置向对应. 顺序容器类型概述 容器名称 容器特性 访问特性 修改特性 vector 可变大小数组 随机 尾部插入/删除速度快 deque 双端队列 随机 头尾位置插入/删除速度快 list 双向链表 双向顺序 任意位置插入/删除均很快 forward_list 单项链表 单向顺序 任意位置插入/删除均很快 array

【STL容器学习笔记】-顺序容器

STL提供了三个顺序容器:vector.list和deque.Vector和deque都是用数组来实现的,list是用链表来实现的.关于三者的实现原理和各自应用的场景我们做一下分析. 1.vector就是动态数组,它是在堆中分配内存,如果vector中元素个数大于当前大小时,就会再分配内存.它拥有一段连续的内存空间,并且起始地址不变,因此它能很好地支持随机访问元素,即[ ]操作符.vector对末尾元素进行操作(添加或者删除元素)最快,因为不用移动内存.但如果是在中间位置插入或者删除元素,因为要

C++学习基础四——顺序容器和关联容器

—顺序容器:vector,list,queue1.顺序容器的常见用法: #include <vector> #include <list> #include <queue> (1)vector声明 vector<string> svec;(2)添加元素: c.push_back(t): 在容器 c 的尾部添加值为 t 的元素.返回 void 类型  c.push_front(t):在容器 c 的前端添加值为 t 的元素.返回 void 类型 只适用于 lis

C++ Primer学习总结 第9章 顺序容器

第9章 顺序容器 1.    顺序容器如果有一个只需要容器大小参数的默认构造函数,该函数使用的是元素的默认构造函数来构造每个元素对象,如果该容器的元素没有默认构造函数,那么就不能使用这个容器的该构造函数P294: 2.    容器进行拷贝初始化时,两个容器的元素必须同类型. 但是如果列表初始化,或迭代器范围初始化容器,那么只要求列表中元素或迭代器所指元素可以转化为容器的元素即可. 3.    容器类型可以直接通过=号赋值(包括array容器数组类型): 注意:assign仅适用于顺序容器(但不适

网络编程学习小结

几种网络编程方式: ISAPI.CGI.WinInet.Winsock 它们之间的差别: 1)  ISAPI主要是开发基于浏览器client与server端程序.效率比CGI方式高,并且也扩展了CGI没有的一些功能.(基于TCP/IP模型中的应用层) 2)  CGI主要是开发基于浏览器client与server端程序.(基于TCP/IP模型中的应用层) 3)  WinInet主要是开发client程序.(基于TCP/IP模型中的应用层) 4)  Winsock主要是基于socket来开发clie

MogileFS学习小结

大纲: 一.关于MogileFS 二.常见分布式文件系统 三.MogileFS基本原理 四.MogileFS的实现 一.关于MogileFS 当下我们处在一个互联网飞速发展的信息社会,在海量并发连接的驱动下每天所产生的数据量必然以几何方式增长,随着信息连接方式日益多样化,数据存储的结构也随着发生了变化.在这样的压力下使得人们不得不重新审视大量数据的存储所带来的挑战,例如:数据采集.数据存储.数据搜索.数据共享.数据传输.数据分析.数据可视化等一系列问题. 传统存储在面对海量数据存储表现出的力不从