实战c++中的vector系列--C++11对vector成员函数的扩展(cbegin()、cend()、crbegin()、crend()、emplace()、data())

前面提到的emplace_back就是C++11所增加的内容。

所以这篇博客就是想罗列一下C++11对vector容器的扩充。

std::vector::cbegin和std::vector::cend

这两个方法是与std::vector::begin和std::vector::end相对应的,从字面就能看出来,多了一个’c’,顾名思义就是const的意思。

所以:

std::vector::cbegin: Returns a const_iterator pointing to the first element in the container.

std::vector::cend: Returns a const_iterator pointing to the past-the-end element in the container.

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector = {10,20,30,40,50};

  std::cout << "myvector contains:";

  for (auto it = myvector.cbegin(); it != myvector.cend(); ++it)
    std::cout << ‘ ‘ << *it;
  std::cout << ‘\n‘;

  return 0;
}
Output:
myvector contains: 10 20 30 40 50

std::vector::crbegin和std::vector::crend

这两个方法就不解释了,与上面的相比就是多了个’r’, reverse的缩写,反转迭代器,代码就省略了。

std::vector::emplace

之前已经对emplace_back进行了讨论,其实还有一个方法叫emplace。

我想说的就是,emplace之于emplace_back就像insert之于push_back。

看英文描述就直观:

emplace:Construct and insert element

emplace_back:Construct and insert element at the end

如何使用:

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector = {10,20,30};

  auto it = myvector.emplace ( myvector.begin()+1, 100 );
  myvector.emplace ( it, 200 );
  myvector.emplace ( myvector.end(), 300 );

  std::cout << "myvector contains:";
  for (auto& x: myvector)
    std::cout << ‘ ‘ << x;
  std::cout << ‘\n‘;

  return 0;
}
Output:
myvector contains: 10 200 100 20 30 300

std::vector::data

Returns a direct pointer to the memory array used internally by the vector to store its owned elements.

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector (5);
  int* p = myvector.data();
  *p = 10;
  ++p;
  *p = 20;
  p[2] = 100;
  std::cout << "myvector contains:";
  for (unsigned i=0; i<myvector.size(); ++i)
    std::cout << ‘ ‘ << myvector[i];
  std::cout << ‘\n‘;

  return 0;
}
Output:
myvector contains: 10 20 0 100 0

std::vector::shrink_to_fit

Requests the container to reduce its capacity to fit its size.

就是减少空间

#include <iostream>
#include <vector>
int main ()
{
  std::vector<int> myvector (100);
  std::cout << "1. capacity of myvector: " << myvector.capacity() << ‘\n‘;
  std::cout << "1. size of myvector: " << myvector.size() << ‘\n‘;

  myvector.resize(10);
  std::cout << "2. capacity of myvector: " << myvector.capacity() << ‘\n‘;
  std::cout << "2. size of myvector: " << myvector.size() << ‘\n‘;

  myvector.shrink_to_fit();
  std::cout << "3. capacity of myvector: " << myvector.capacity() << ‘\n‘;
 std::cout << "3. size of myvector: " << myvector.size() << ‘\n‘;
  return 0;
}
//输出
1. capacity of myvector: 100
1. size of myvector: 100
2. capacity of myvector: 100
2. size of myvector: 10
3. capacity of myvector: 10
3. size of myvector: 10

此时,就是要明白size和capacity的区别,也就会更加理解resize和reserve的区别了!

时间: 2024-10-03 14:45:01

实战c++中的vector系列--C++11对vector成员函数的扩展(cbegin()、cend()、crbegin()、crend()、emplace()、data())的相关文章

实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----------------------------------------------vcBuf.resize(stBuf.size());vcBuf.assign(stBuf.begin(), stBuf.end()); vector 转 string  stBuf.clear();stBuf.assign(v

实战c++中的vector系列--copy set to vector(别混淆了reserve和resize)

stl算法中有个copy函数.我们能够轻松的写出这种代码: #include <iostream> #include <algorithm> #include <vector> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { double darray[10]={1.0,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9}; vector<double> vdoubl

【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态

实现基类(父类)以及派生类(子类),验证继承与转换--赋值兼容规则: 子类对象可以赋值给父类对象(切割/切片) 父类对象不能赋值给子类对象 父类的指针/引用可以指向子类对象 子类的指针/引用不能指向父类对象(可以通过强制类型转换完成) #include<iostream> using namespace std; class People    //父类或者基类 { public:     void Display()     {         cout << "_na

C#中Stack&lt;T&gt;类的使用及部分成员函数的源码分析

Stack<T>类 Stack<T> 作为数组来实现. Stack<T> 的容量是 Stack<T> 可以包含的元素数. 当向 Stack<T> 中添加元素时,将通过重新分配内部数组来根据需要自动增大容量. 可通过调用 TrimExcess 来减少容量. 如果 Count 小于堆栈的容量,则 Push 的运算复杂度是 O(1). 如果需要增加容量以容纳新元素,则 Push 的运算复杂度成为 O(n),其中 n 为 Count. Pop 的运算复杂

实战c++中的string系列--std:vector&lt;char&gt; 和std:string相互转换(vector to stringstream)

有时候也会遇到std:vector与转std:string 相互转换的情况. 首先看一下vector<char>如何转string: std::vector<char> *data = response->getResponseData(); std::string res; //方法一 for (int i = 0;i<data->size();++i) { res+=(*data)[i]; } res+='\0'; std:cout << res;

实战c++中的string系列--string的遍历(使用下标还是iterator)

迭代器提供了访问容器中对象的方法.例如,可以使用一对迭代器指定list或vector中的一定范围的对象.迭代器就如同一个指针.事实上,C++的指针也是一种迭代器.但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象. 我们都知道可以用下标运算来访问string对象和vector对象.而另外还有一种更通用的方法也可以实现这样的方法.名曰:迭代器(iterator). 类似于指针,迭代器也提供了对对象的间接访问.就迭代器而言,其对象是容器中的元素或者strin

实战c++中的string系列--string的分割、替换(类似string.split或是explode())

对一个字符串根据某个字符进行分割也是在实战中经常遇到的问题,也是面试中经常会被人提及的. 如果你是个C Sharp程序员,你会知晓string.split函数,有下面这些重载: 1) public string[] Split(params char[] separator) 2) public string[] Split(char[] separator, int count) 3) public string[] Split(char[] separator, StringSplitOpt

实战c++中的string系列--string与char*、const char *的转换(data() or c_str())

在project中,我们也有非常多时候用到string与char*之间的转换,这里有个一我们之前提到的函数 c_str(),看看这个原型: const char *c_str(); c_str()函数返回一个指向正规C字符串的指针, 内容与本string串同样. 这就看到了吧,返回值是const char*,这里须要注意一下. 1 string转const char* 当然是用到上面所述的方法c_str(): string s1 = "abcdeg"; const char *k =

实战c++中的string系列--十六进制的字符串转为十六进制的整型(一般是颜色代码使用)

非常久没有写关于string的博客了.由于写的差点儿相同了.可是近期又与string打交道,于是荷尔蒙上脑,小蝌蚪躁动. 在程序中,假设用到了颜色代码,一般都是十六进制的,即hex. 可是server给你返回一个颜色字符串.即hex string 你怎么把这个hex string 转为 hex,并在你的代码中使用? 更进一步,你怎么办把一个形如"#ffceed"的hex string 转为 RGB呢? 第一个问题在Java中是这样搞的: public static int parseC