C++顺序容器的赋值与swap

顺序容器的赋值与swap

直接赋值与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};

V.size()返回一个size_type 无符号类型的值。同样也可以进行判断是否为空操作。V.empty(),返回bool值。

V.max_size()返回一个大于或等于该容器所能存储的最大大小。

我尝试了一下返回了一个很大的值。

这些顺序容器也能进行关系运算,类似与string。(前提是两个操作对象类型相同)

附带一张练习时的代码:


/*
 *再次探索C++中的顺序容器
 *了解容器中的具体操作
*/

//调用库文件
#include<iostream>
#include<string>
#include<vector>
#include<array>
#include<deque>
#include<list>
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


一步一步慢慢学,不怕学的比别人慢,就怕什么也没学懂。

​ ----致自己

猜你喜欢

转载自blog.csdn.net/arctic_fox_cn/article/details/80445146
今日推荐