长春建网站一般要多少钱,纸箱 技术支持 东莞网站建设,百度短链接在线生成,西安北郊网站维护运营C 1、C标准库2、C标准模板库2.1、vector2.1.1、vector与array2.1.2、vector与函数对象2.1.3、vector与迭代器2.1.4、vector与算法 1、C标准库 C C C标准库指的是标准程序库( S t a n d a r d Standard Standard L i b a r a y Libaray Libaray)#xff0c;它定义了十个大类… C 1、C标准库2、C标准模板库2.1、vector2.1.1、vector与array2.1.2、vector与函数对象2.1.3、vector与迭代器2.1.4、vector与算法 1、C标准库 C C C标准库指的是标准程序库( S t a n d a r d Standard Standard L i b a r a y Libaray Libaray)它定义了十个大类其中包括我们比较熟悉的 i o s t r e a m , s t r i n g iostream, string iostream,string都是这十个大类的其中一个类中的一个小类。而 c c c的标准模板库也只是占了其中三个大类而已。 上面这十个类还只是一个些大类这十个大类下面还有51个小类。例如容器类下有这些小类 更多内容可以参考这篇文章链接: C标准库。 使用的时候由于十个大类是一个抽象集合本身是没办法调用的。我们只能调用这些大类下的小类且必须通过添加头文件的形式。同时 C C C标准强制头文件不要加 . h .h .h。下面是一些例子
#includeiostream //调用输入输出类中的标准输入输出类
#includestring //调用字符串类
#includevector //调用容器类中的vector
#includequeue //调用容器类中的queue
#includealgorithm //调用算法类2、C标准模板库
标准模板库( S T L : STL: STL: S t a n d a r d Standard Standard T e m p l a t e Template Template L i b r a r y Library Library)区别于标准库它是一组用于处理各种容器对象的模板提供了表示容器、迭代器、函数对象、和算法的模板。也就是说标准模板库是为服务容器而设计的。其中比较容易被忽略的是 a r r a y array array其实也是容器中的一种。 如上图所示迭代器、函数对象、算法它们虽然同属于 S T L STL STL库的基本组件但其实都是服务于容器的。
2.1、vector V e c t o r Vector Vector中文名是矢量的意思是容器类中最基础也是最重要的一个类。
2.1.1、vector与array
在 C C C中 v e c t o r vector vector和 a r r a y array array数组有很多相似之处它们都可以被用于存放某一类型的变量。下面则来看一个入门级别的应用——用vector存放特定类型的数值。
#includeiostream
#includevector#define num 5
using namespace std;int main()
{vectorint mycontain(num); //声明一个存放整形变量的vectorfor(int i0; inum; i){coutplease enter the i1 number : ;cinmycontain[i]; //跟往数组里面放数据一样往vector里面放数据}for(int i0; inum; i){coutmycontain[i] ;}cout\n;return 0;
}2.1.2、vector与函数对象 v e c t o r vector vector比 a r r a y array array高级的地方莫过于它能和函数对象、算法以及迭代器结合起来使用下面直接通过一些例子了解 v e c t o r vector vector和一些常规函数对象的结合。
#includeiostream
#includevectorusing namespace std;void print_vector(void); //define a function to print all of numbers in the vectorvectorint my_vector;int main()
{int i,temp;//push some number into the vector and print all of themwhile(1){coutplease enter the i number : ;cintemp;my_vector.push_back(temp); //push_back( )一个往vector的末端添加数字的函数有且仅有一个输入参数。pd my_vector.end(); //end()返回值是vector末端的地址无输入参数。if(*(my_vector.end()-1) 0) break; //if the last number you enter is zero, the program will jump out the loop.}print_vector();//erase some numbers in the vector and print out the restmy_vector.erase(my_vector.begin(), my_vector.begin()2); //.erase( , )拆除vector中某一段数字有两个输入参数第一个是将要擦除的起始地址另一个是停止地址。//.begin()返回值是vector的首部地址无输入参数。print_vector();//insert a number into the vector and print all of them.my_vector.insert(my_vector.end(), 9); //.insert( , )往vector某个地方插入一个数字两个输入参数第一个是要插入的地址另一个是要插入的数字print_vector();return 0;
}void print_vector(void)
{for(int i0; imy_vector.size(); i) //.size()返回值vector的尺寸大小。{coutmy_vector[i] ;} cout\n;
}看完代码再来根据解决代码中的几个疑惑点。其一在这句代码“if(*(my_vector.end() - 1) 0)”my_vector.end()的返回值是一个迭代器但我这里并没有定义一个迭代器去接收它的返回值而是直接调用该代码然后解引用。其实这样是合规的。其二同样是这句代码我为了拿到vector中的最后一个值我需要在尾部的地址基础上减去一。这是由vector的性质决定的我们来看看这个图。 如上图所示my_vector.end()拿到的并不是最后一个数据的地址而是内存中其他数据的地址。又由于vector的地址从尾部到首部呈现从高到低分布所以需要减一而非加一。 值得一提的是 v e c t o r vector vector的数据输入输出方式是从尾部输入从首部输出。并且当有新的数据输入进来的时候my_vector.end()的迭代器会指向新输入进来的数据。而不是新输入的数据取代原来尾部的数据这个理解尤为重要。
2.1.3、vector与迭代器
上文有提到过my_vector.begin()和my_vector.end()的返回值是一个迭代器并且这个迭代器可以像指针那样操作。便可以大概看出迭代器和指针颇为相似。但两者的区别是指针指向的必须是连续的内存空间但迭代器指向的可以是间断的内存空间。这是由于一些容器的内存分配可能零散导致的如图 容器的内存空间可能间断分布而为了准确寻找容器中的数据迭代器就应运而生了。不过迭代器也分为五个种类本人学识有限就只介绍可用于 v e c t o r vector vector的那一种。直接上个例子
#includeiostream
#includevectorusing namespace std;int main()
{vectorint my_vector;vectorint::iterator iter; //定义一个存放vectorint地址的迭代器int temp,i0;while(1){coutplease enter the i number : ;cintemp;my_vector.push_back(temp); //由于内存分布不完整当你没添加数据进去之前它压根不知道下一个数据在那个位置所以不能用my_vector[i]的方式赋值。iter my_vector.end(); //把尾部的地址传给迭代器iterif(*(iter-1) 0) break; //解引用迭代器以获得对象的值}for(i0; i my_vector.size(); i){iter my_vector.begin();cout*(iteri) ; //同上}cout\n;return 0;
}2.1.4、vector与算法
这里的算法特指对vector内部数据进行处理的算法如排序、变换、打乱等。直接上代码看看一些常用的算法怎么用。由于算法部分内容太庞大了所以这几句话带过会显得十分草率。
#includeiostream
#includealgorithm
#includevector
#includeiteratorusing namespace std;void vector_print(void);
vectorint::iterator iter;
int array[9] {1,5,2,7,9,11,3,6,2};
vectorint my_vector(array,array9);int main()
{ sort(my_vector.begin(), my_vector.end(), greaterint()); //输入参数为两个或者三个前两个参数为迭代器的始末值最后一个参数是排序标准。vector_print();random_shuffle(my_vector.begin(), my_vector.end()); //输入参数为两个前两个参数为迭代器的始末值。vector_print();vectorint::iterator temp find(my_vector.begin(), my_vector.end(), 9); //前两个参数为迭代器的始末值最后一个参数是要查找的值返回值也是一个迭代器。cout*tempendl;return 0;
}void vector_print()
{iter my_vector.begin();for(int i 0;imy_vector.size();i){cout*(iteri) ;}cout\n;
}