直接赋值与assign(assignment):
//容器初始化 vector<int> var_1{1,2,3,4,5}; vector<int> var_2{9,8,7,6,11,12,13,14}; vector<float> var_f1{1.2,1.3,1.4,1.5}; list<string> boss{"马云","马化腾"}; array<int,9> arra_1{1,2,3}; array<int,9> <arra_2>{123,456,789,1212,3434}; //容器赋值,特殊的是array,他与内置数组不一样,内置数组不允许直接复制,而array则允许,但前提是类型、大小相同 //赋值必须左右操作类型相同 var_1=var_2; arra_1=arra_2; //而assign则允许左右两个操作类型不同但是相容类型赋值 var_1.assign(var_f1.begin(),var_f1.end());//assign接受var_f1的迭代器范围,然后把var_f1的值转换成int赋值给var_1 var_1.assign(11,99);//var_1容器中现在的元素为11个99 name.assign(9,"坚持!");//name容器中有9个”坚持“ arra_1={0};//可以执行 /* *C++primer 说不允许用列表赋值,但是在支持C++11标准的g++编译器中是可以运行成功的。 *因为在C++11标准新增aray的{}初始化std::initializer_list. */
Swap交换两个相同容器中的内容
array执行swap操作时会对容器内部元素做交换,故而其交换时间与array数目成正比,也不会使array迭代器和引用关联到别的容器中。
而其他容器进行swap操作时,不会对容器内部元素进行交换,而是对于容器内部数据结构进行改变。
将内容与其它容器的交换。不在单个元素上调用任何移动、复制或交换操作。[string除外]所有迭代器和引用保持合法。尾后迭代器被非法化。
string 进行swap操作。交换 string 与 其他容器的内容。可能非法化所有迭代器和引用。
//这个例子,会出现意想不到的错误,程序编译成功,执行过程中,正确输出了迭代器部分,但在end()迭代器之后全是些未知数据。 //所以我此刻的理解是,如果调用swap操作,就不能进行开始迭代器与尾后迭代器的判断了,没有任何意义了,反而会出错。 void test(vector<int> &var_int,vector<int> &var_int1) { for(auto beg=var_int1.begin();beg!=var_int1.end();++beg) { if(*beg==var_int1[3]) swap(var_int,var_int1); cout<<*beg<<"\t"; }
什么叫做对内容的改变而非元素的操作:
个人理解:应该类似于指针的转换,把一个指向另一个指向 。然后交换所指向的内容。
容器的大小:
vector<int> V{1,2,3,4,5};
扫描二维码关注公众号,回复:
1477517 查看本文章
V.size()返回一个size_type 无符号类型的值。同样也可以进行判断是否为空操作。V.empty(),返回bool值。
V.max_size()返回一个大于或等于该容器所能存储的最大大小。
我尝试了一下返回了一个很大的值。
这些顺序容器也能进行关系运算,类似与string。(前提是两个操作对象类型相同)
附带一张练习时的代码:
/* *再次探索C++中的顺序容器 *了解容器中的具体操作 */ //调用库文件 using namespace std; //结构体定义区域 struct deqs{ vector<int> num; list<string> name; }; //函数声明区域 void assignment( vector<int> &value, vector<int> &ll); void toswap(list<string> &value,list<string> &ll); void test(vector<int> &var_int,vector<int> &var_int1); int main() { deqs a,b; a.num={1,2,34,22}; b.num={1,2,3,4,5,6}; deqs str_1,str_2; str_1.name={"小米","华为","腾讯","阿里"}; str_2.name={"Google","Microsoft","Inter","AMD","IBM","Facebook"}; assignment(a.num,b.num); toswap(str_1.name,str_2.name); //容器初始化 vector<int> var_1{1,2,3,4,5}; vector<int> var_2{9,8,7,6,11,12,13,14}; vector<float> var_f1{1.2,1.3,1.4,1.5}; list<string> boss{"马云","马化腾"}; array<int,9> arra_1{1,2,3}; array<int,9> arra_2{123,456,789,1212,3434}; //容器赋值,特殊的是array,他与内置数组不一样,内置数组不允许直接复制,而array则允许,但前提是类型、大小相同 //赋值必须左右操作类型相同 // var_1=var_2; arra_1=arra_2; //而assign则允许左右两个操作类型不同但是相容类型赋值 // var_1.assign(var_f1.begin(),var_f1.end()); // var_1.assign(11,99); boss.assign(9,"坚持!"); arra_1={1}; test(var_1,var_2); cout<<endl<<"大小:"<<var_f1.size(); cout<<endl<<"最大:"<<var_f1.max_size(); return 0; } //函数定义区域 void assignment( vector<int> &value, vector<int> &ll) { cout<<"赋值之前的a:"<<endl; for(auto i: value) { cout<<i<<"\t"; } cout<<endl; // value=ll; value.assign(6,99); cout<<"赋值之后的a:"<<endl; for(auto i:value) { cout<<i<<"\t"; } cout<<endl; } void toswap(list<string> &value,list<string> &ll) { cout<<"变换之前的str_1:"<<endl; for(auto i: value) { cout<<i<<"\t"; } cout<<endl; cout<<"变换之前的str_2:"<<endl; for(auto i: ll) { cout<<i<<"\t"; } cout<<endl; swap(value,ll); cout<<"变换之后的str_1:"<<endl; for(auto i:value) { cout<<i<<"\t"; } cout<<endl; cout<<"变换之后的str_2:"<<endl; for(auto i:ll) { cout<<i<<"\t"; } cout<<endl; } void test(vector<int> &var_int,vector<int> &var_int1) { int i=0; for(auto beg=var_int1.begin();i<7;++beg) { if(*beg==var_int1[3]) swap(var_int,var_int1); cout<<*beg<<"\t"; i++; } /*void test(vector<int> &var_int,vector<int> &var_int1) { for(auto beg=var_int1.begin();beg!=var_int1.end();++beg) { if(*beg==var_int1[3]) swap(var_int,var_int1); cout<<*beg<<"\t"; }*/ }
Run:
bin/ch2$ ./deq 赋值之前的a: 1 2 34 22 赋值之后的a: 99 99 99 99 99 99 变换之前的str_1: 小米 华为 腾讯 阿里 变换之前的str_2: Google Microsoft Inter AMD IBM Facebook 变换之后的str_1: Google Microsoft Inter AMD IBM Facebook 变换之后的str_2: 小米 华为 腾讯 阿里 9 8 7 6 11 12 13 大小:4 最大:4611686018427387903
一步一步慢慢学,不怕学的比别人慢,就怕什么也没学懂。
----致自己