实战c++中的vector系列--构造、operator=和assign差别

vector或许是实际过程中使用最多的stl容器。看似简单,事实上有非常多技巧和陷阱。

着重看一看vector的构造,临时依照C++11:

default (1)
explicit vector (const allocator_type& alloc = allocator_type());

fill (2)
explicit vector (size_type n);
         vector (size_type n, const value_type& val,
                 const allocator_type& alloc = allocator_type());

range (3)
template <class InputIterator>
  vector (InputIterator first, InputIterator last,
          const allocator_type& alloc = allocator_type());

copy (4)
vector (const vector& x);
vector (const vector& x, const allocator_type& alloc);

move (5)
vector (vector&& x);
vector (vector&& x, const allocator_type& alloc);

initializer list (6)
vector (initializer_list<value_type> il,
       const allocator_type& alloc = allocator_type());

直接看看以下的代码,就知道怎样构造一个vector了:

#include <iostream>
#include <vector>

int main ()
{

  std::vector<int> first;                                // default (1)
  std::vector<int> second (4,100);                       // fill (2)
  std::vector<int> third (second.begin(),second.end());  // range (3)
  std::vector<int> fourth (third);                       // a copy of third

  // the iterator constructor can also be used to construct from arrays:
  int myints[] = {16,2,77,29};
  std::vector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );

  std::cout << "The contents of fifth are:";
  for (std::vector<int>::iterator it = fifth.begin(); it != fifth.end(); ++it)
    std::cout << ‘ ‘ << *it;
  std::cout << ‘\n‘;

  return 0;
}

===========================================================

vector重载了=运算符,也有一个叫assign的方法,并且有什么差别吗?

std::vector::operator=

直接代码:

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> foo (3,0);
  std::vector<int> bar (5,0);

  bar = foo;
  foo = std::vector<int>();

  std::cout << "Size of foo: " << int(foo.size()) << ‘\n‘;
  std::cout << "Size of bar: " << int(bar.size()) << ‘\n‘;
  return 0;
}

//结果:
Size of foo: 0
Size of bar: 3

这里须要说明的是:

replacing its current contents

modifying its size accordingly

std::vector::assign

相同直接代码:

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> first;
  std::vector<int> second;
  std::vector<int> third;

  first.assign (7,100);             // 7 ints with a value of 100

  std::vector<int>::iterator it;
  it=first.begin()+1;

  second.assign (it,first.end()-1); // the 5 central values of first

  int myints[] = {1776,7,4};
  third.assign (myints,myints+3);   // assigning from array.

  std::cout << "Size of first: " << int (first.size()) << ‘\n‘;
  std::cout << "Size of second: " << int (second.size()) << ‘\n‘;
  std::cout << "Size of third: " << int (third.size()) << ‘\n‘;
  return 0;
}
//输出:
Size of first: 7
Size of second: 5
Size of third: 3

这里相同须要说明:

replacing its current contents

modifying its size accordingly

时间: 2024-10-31 06:03:20

实战c++中的vector系列--构造、operator=和assign差别的相关文章

实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)

之前说过了关于vector的insert()方法,把vector B的元素插入到vector A中,vector A中的结果我们可想而知,但是vector B中的元素还会如何? 看看之前写过的程序: #include <iostream> #include <vector> int main () { std::vector<int> myvector (3,100); std::vector<int>::iterator it; it = myvector

实战c++中的vector系列--vector的遍历(stl算法、vector迭代器(不要在循环中判断不等于end())、operator[])

遍历一个vector容器有很多种方法,使用起来也是仁者见仁. 通过索引遍历: for (i = 0; i<v.size(); i++) { cout << v[i] << " "; } 迭代器遍历: for (vInt::const_iterator iter = v.begin(); iter != v.end();iter++) { cout << *iter << " "; } 算法遍历: copy(v.b

实战c++中的vector系列--对vector&amp;lt;自己定义类&amp;gt;使用std::find 和 std::find_if 算法

之前博客讲了一些关于std::find和std::find_ if的一些使用方法.可是没有讲述对于vector中存储的是自己定义的类.那么怎么样使用std::find和std::find_if进行查找呢? 先定义一个类: class Item { private: std::string m_ItemId; int m_Price; int m_Count; public: Item(std::string id, int price, int count): m_ItemId(id), m_C

实战c++中的vector系列--creating vector of local structure、vector of structs initialization

之前一直没有使用过vector<struct>,现在就写一个简短的代码: #include <vector> #include <iostream> int main() { struct st { int a; }; std::vector<st> v; v.resize(4); for (std::vector<st>::size_type i = 0; i < v.size(); i++) { v.operator[](i).a =

实战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++中的vector系列--对vector&lt;自定义类&gt;使用std::find 和 std::find_if 算法

之前博客讲了一些关于std::find和std::find_ if的一些用法,但是没有讲述对于vector中存储的是自定义的类,那么怎么样使用std::find和std::find_if进行查找呢? 先定义一个类: class Item { private: std::string m_ItemId; int m_Price; int m_Count; public: Item(std::string id, int price, int count): m_ItemId(id), m_Coun

实战c++中的vector系列--使用sort算法对vector&lt;unique_ptr&lt;string&gt;&gt;进行排序(sort函数出错“应输入 2 个参数,却提供了 3 个)

之前博客写了对vector使用sort算法进行的排序,之前也写到过vector<unique_ptr<string>>的一些处理方法. 今天就写一下对vector<unique_ptr<string>>使用sort算法进行排序. #include<iostream> #include<string> #include<vector> #include<algorithm> #include<memory&

实战c++中的vector系列--将迭代器转换为索引

stl的迭代器非常方便 用于各种算法. 可是一想到vector.我们总是把他当做数组,总喜欢使用下标索引,而不是迭代器. 这里有个问题就是怎样把迭代器转换为索引: #include <vector> typedef std::vector<char *> MYARRAY; // This does the trick inline const int iterator_to_index(MYARRAY &a, MYARRAY::iterator it) { return i

实战c++中的vector系列--vector&amp;lt;unique_ptr&amp;lt;&amp;gt;&amp;gt;初始化(全部权转移)

C++11为我们提供了智能指针,给我们带来了非常多便利的地方. 那么假设把unique_ptr作为vector容器的元素呢? 形式如出一辙:vector<unique_ptr<int> > vec; 可是怎么给vec加入元素呢? 看以下: #include<iostream> #include<vector> #include <memory> using namespace std; int main() { vector<unique_