c++11标准模板库(STL) - array、vector

2018-07-09 11:33:00

array 是大小固定的容器,不能放大和收缩,效率接近于常规数组,0长度的 array 是合法的,只是不能解引用(front,back,data),array 在内存里是连续存储的,所以可以通过指针偏移来访问。

详细说明读者可以参考 array - C++ Reference

//头文件
#include <array>

array::back()

返回最后一个元素的引用。

array::front()

返回第一个元素的引用。

array::begin()

返回迭代器,指向第一个元素,空数组等同于 array::end()。

array::end()

返回迭代器,指向最后一个元素。

array::size()

返回数组里可以容纳元素的个数,注意区别 sizeof 。

array::max_size()

同上。

#include <iostream>
#include <array>

int main (){
  std::array<int,5> myints;
  std::cout << "size of myints: " << myints.size() << std::endl;
  std::cout << "size of myints: " << myints.max_size() << std::endl;
  std::cout << "sizeof(myints): " << sizeof(myints) << std::endl;

  return 0;
}
[root@192 c++]# g++ -std=c++11 main.cpp 
[root@192 c++]# ./a.out 
size of myints: 5
size of myints: 5
sizeof(myints): 20

array::empty()

返回 bool,用来判断 array 是否为空。

array::at(n)

返回 n 处元素的引用,n 不在数组范围的时候抛出 out_of_range exception。

#include <iostream>
#include <array>
#include <exception>

int main (){
  std::array<int,10> myarray;

  for (int i=0; i<10; i++) myarray.at(i) = i+1;

  std::cout << "myarray contains:";
  for (int i=0; i<10; i++)
    std::cout << ' ' << myarray.at(i);
  std::cout << '\n';
  
  try{
    std::cout << myarray.at(11);
  }catch(std::out_of_range & e){
    std::cout << e.what() << std::endl;
  }catch(std::exception& e){
    std::cout << "unknown" << std::endl;
  }
  
  return 0;
}
[root@192 c++]# g++ -std=c++11 main.cpp 
[root@192 c++]# ./a.out 
myarray contains: 1 2 3 4 5 6 7 8 9 10
array::at

array::operator[n]

返回n处元素的引用,但是不抛出异常。

#include <iostream>
#include <array>

int main (){
  std::array<int,10> myarray;
  unsigned int i;

  for (i=0; i<10; i++) myarray[i]=i;

  std::cout << "myarray contains:";
  for (i=0; i<10; i++)
    std::cout << ' ' << myarray[i];
  std::cout << '\n';

  return 0;
}
[root@192 c++]# g++ -std=c++11 main.cpp 
[root@192 c++]# ./a.out 
myarray contains: 0 1 2 3 4 5 6 7 8 9

array::data()

返回指向第一个元素的指针,因为在 array 里元素是连续存储的。

const char* cstr = "hello freecls";
std::array<char,14> charray;
std::memcpy (charray.data(),cstr,14);
std::cout << charray.data() << '\n';

array::fill(val)

全部内容设置为 val


vector 是大小可变的容器,读取效率接近于常规数组,在内存里也是连续存储的,所以可以通过指针偏移来访问。vector 从末尾插入移除数据效率很高,但是从中间插入或者移除数据将非常缓慢。

详细说明读者可以参考 vector - C++ Reference

//头文件
#include <vector>

vector::push_back(&val)

从最后高效率插入数据,一旦满了,会自动扩充内存。

vector::pop_back()

从最后高效率删除元素。

vector::insert

在指定位置插入元素,不在末尾插入数据将会非常慢,因为c++需要重新分配全部内存。

#include <iostream>
#include <vector>

int main (){
  //初始化3个100整数
  std::vector<int> myvector (3,100);
  std::vector<int>::iterator it;

  it = myvector.begin();
  
  //开头插入200,并返回当前迭代位置
  it = myvector.insert (it , 200 );

  //再插入2个300
  myvector.insert (it,2,300);

  it = myvector.begin();

  std::vector<int> anothervector (2,400);
  myvector.insert (it+2,anothervector.begin(),anothervector.end());

  int myarray [] = { 501,502,503 };
  myvector.insert (myvector.begin(), myarray, myarray+3);

  std::cout << "myvector contains:";
  for (it=myvector.begin(); it<myvector.end(); it++)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}
[root@192 c++]# g++ -std=c++11 main.cpp 
[root@192 c++]# ./a.out 
myvector contains: 501 502 503 300 300 400 400 200 100 100 100

vector::capacity

返回当前 vector 已经分配的可容纳的元素个数,当然了,一旦耗尽,它会自动增加。

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector;

  // set some content in the vector:
  for (int i=0; i<100; i++) myvector.push_back(i);

  std::cout << "size: " << (int) myvector.size() << '\n';
  std::cout << "capacity: " << (int) myvector.capacity() << '\n';
  std::cout << "max_size: " << (int) myvector.max_size() << '\n';
  return 0;
}

vector::operator=

内容完全被复制和替换,大小也会变。


 备注

1.编译器版本gcc4.8.5,运行环境centos7 64位
2.本文只做简单记录用,详细用法读者可以参考文中给出的链接
3..原文地址http://www.freecls.com/a/2712/95 

 

©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。