std::vector

 

初始化

std::vector<int> vec;   // 空对象

std::vector<int> vec(5,-1); // 创建了一个包含5个元素且值为-1的vector

std::vector<std::string> strVec{"a", "b", "c"};  // 列表初始化   

要注意“()”和“{}”这样的初始化情况,比如:

std::vector<int> vec(10,1);    // 包含10个元素,且值为1 

std::vector<int> vec{10,1};    // 包含2个元素,值分别为10,1

成员访问

std::vector<int> vec(10,1);

int val = vec[1];   // 下标访问

int val2 = vec.at(1);

赋值

for(int i = 0; i < 5; ++i){ vec.push_back(i); }

插入元素

std::vector<int> vec(10,1);

vec.insert(pos,num); // 在pos位置插入元素num

vec.insert(pos,n,num); // 在pos位置插入n个元素num

vec.insert(pos.beg,end);// 在pos位置插入区间为[beg,end)的元素

注意:

1.一般insert函数将元素插入到迭代器所指定的位置之前

2. vector insert 效率极低;

删除元素

vec.erase(p);// 删除迭代器p所指定的元素,返回一个指向被删除元素之后的迭代器

vec.erase(begin,end);//删除b,e所指定范围内的元素,返回一个指向最后被删除元素之后的迭代器。

vec.clear();// 删除所有元素

注意,删除元素,会导致迭代器无效

std::vector<int>::iterator iter = vec.begin();

  for(; iter != vec.end();){

    if(*iter == 0) iter = vec.erase(iter);

    else iter++;

  }

  删除容器内某一个特定的元素,编写方式可为:

  std::vector<int>::iterator iter = std::find(vec.begin(),vec.end(),5);

  if(iter != vec.end())

    vec.erase(iter);

  删除容器内某一段范围内的元素,编写方式可为:

  first = std::find(vec.begin(),vec.end(), value1);

  last = std::find(vec.begin(),vec.end(), value2);

  if(first != vec.end() && last != vec.end())    // 判断有效性

  {

    vec.erase(first,last);

  }

 

  删除容器内所有元素,当然可以这样:

  vec.erase(vec.begin(),vec.end());

  也可以 vec.clear();

遍历

std::vector<int>::iterator it = vec.begin();

auto it_end = vec.end();

  for(; it != it_end; ++it){

    std::cout << (*it)  << std::endl;

}             

const int n = vec.size();

for(int i=0;i<n;++i){

std::cout << vec[i]  << std::endl;

}

 

数据拷贝与交换

1:void assign(const_iterator first,const_iterator last);

2:void assign(size_type n,const T& x = T());

第一个相当于个拷贝函数,把first到last的值赋值给调用者;(注意区间的闭合)

第二个把n个x赋值给调用者;

 

vector<int> v1, v2;

v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
v2.assign(v1.begin(), v1.end());using namespace std;
vector<int> v1, v2;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
v2.assign(v1.begin(), v1.end()); //两个指针,分别指向复制开始和结束的地方.

v1.assign(10,7);//将v1重新赋值为10个7

for(auto it = v2.begin(); it !=v2.end(); ++it){

                   cout<<*it<<" ";

}

cout<<endl;

for(auto i = v1.begin(); it !=v1.end(); ++it){

                   cout<<*it<<" ";

}

输出结果:

10 20 30 40 50

7 7 7 7 7 7 7 7 7 7

 

交换:

vector<int> vec(10,1);

vector<int> temlist;

temlist.swap(list);

1. 将list中数据全部移到temlist中,此时list中为空了

2. swap操作交换两个相同类型的容器的内容,一般的容器(除array外),交换两个容器内容的操作会保证非常快,因为并没有交换元素本身,而只是交换了两个容器的内部数据结构。 

 

排序

std::sort(vec.begin(),vec.end()); //使用内部排序,如果vec内部是复杂结构,需要重载实现operator<操作

std::sort(vec.begin(),vec.end(), cmp )

cmp可以是一个函数对象类,或函数指针 或 lambda表达式;

查找

std::binary_search

std::lower_search

std::upper_search

 

posted @ 2019-06-09 21:55  Reboost  阅读(528)  评论(0)    收藏  举报