c++标准库——STL容器的通用能力和操作
1136 Views
- Add Comment
- Trackback
1 通用容器能力
(1)所有STL容器提供值语义而不是引用语义。当向容器中放入元素时,在容器内部拷贝一份该对象的复制实例。所以STL容器中的元素要求必须是可复制的。
(2)通常意义上说,STL容器中的所有元素都是有次序的,也就是说都是可以固定索引的。这样我们就可以以相同的元素顺序遍历容器多次。
(3)通常意义上说,STL容器的操作都是没有安全保证的。调用者自己必须保证这些操作参数的有效性,违背了这些参数的限定,将导致不可知的行为。
2 通用容器操作
Operation Effect
ContType c Creates an empty container without any element
ContType c1(c2) Copies a container of the same type
ContType c(beg,end) Creates a container and initializes it with copies of all elements of [beg,end)
c.~ContType() Deletes all elements and frees the memory
c.size() Returns the actual number of elements
c.empty() Returns whether the container is empty (equivalent to size()==0, but might be faster)
c.max_size() Returns the maximum number of elements possible
c1 == 2 Returns whether c1 is equal to c2
c1 != c2 Returns whether c1 is not equal to c2 (equivalent to !(c1==c2))
c1 < c2 Returns whether c1 is less than c2
c1 > c2 Returns whether c1 is greater than c2 (equivalent to c2<c1
c1 <= c2 Returns whether c1 is less than or equal to c2 (equivalent to !(c2<c1))
c1 >= c2 Returns whether c1is greater than or equal to c2 (equivalent to !(c1<c2))
c1 = c2 Assigns all elements of c1 to c2
c1.swap(c2) Swaps the data of c1and c2
swap(c1,c2) Same (as global function)
c.begin() Returns an iterator for the first element
c.end() Returns an iterator for the position after the last element
c.rbegin() Returns a reverse iterator for the first element of a reverse iteration
c.rend() Returns a reverse iterator for the position after the last element of a reverse iteration
c.insert(pos,elem) Inserts a copy of elem (return value and the meaning of pos differ)
c.erase(beg,end) Removes all elements of the range [beg,end) (some containers return next element not removed)
c.clear() Removes all elements (makes the container empty)
c.get_allocator() Returns the memory model of the container
2.1 初始化操作(initialize)
(1)用另一个容器的元素初始化
std::list<int> col1;
...
//copy all elements of col1 as floats into a vector
std::vector<float> col2(col1.begin(), col1.end());
(2)用数组元素初始化
int arr[] = {3, 5, 7, 23, 45, 67};
...
//copy all elements of array into a set
std::set<int> col1(arr, arr + sizeof(arr)/sizeof(arr[0]));
(3)通过标准输入初始化
std::deque<int> col1((std::istream_iterator<int>(std::cin)),
(std::istream_iterator<int>()));
需要注意的是包含参数的额外括号千万不能省略,如果去掉这里的括号,那么表示的含义就大相径庭了。
2.2 容器大小操作(size)
对于所有的STL容器类,都提供三个跟容器大小相关的操作:size(), empty(), max_size().
2.3 比较操作(comparisons)
针对容器的比较操作符==, !=, <, <=, >, >=依据下面的规则而定义:
(1)两个容器必须有相同的类型;
(2)两个容器相等是指它们包含的元素对应相等并且次序一致;
(3)比较一个容器小于另一个容器,要按照词典比较法(lexicographical comparison)进行。
词典比较法:就是所谓的逐个元素比较法。如果第一个容器的第一个元素值小于第二个容器的第一个元素,那么第一个容器就小于第二个容器;如果第一个元素相等,那么再比较容器的第二个元素,以此类推,直到比较出结果为止。如果第一个容器中的元素依次跟第二个容器中的元素都相等,那么就表示两个容器时相等的。但如果第一个容器中的元素数目少于第二个容器,即使现有的元素都相等,第一个容器也认为小于第二个容器。
2.4 赋值操作(assignment and swap)
把一个容器赋值给另一个容器,首先要删除原有的元素,然后再把源容器中的所有元素复制到目标容器。所以说容器的赋值操作对性能的代价是相当的昂贵的。如果两个容器类型相同,而且源容器不在使用,那么有一个更加优化的方法:swap()。它的执行效率将大大高于普通的容器赋值操作。