vc++ 容器之向量 感悟

vc容器有:

STL容器是一组类模版 ,分为顺序容器、适配器容器、关联容器。vector向量容器 连续存储元素 list表容器
deque双端队列
stack 栈(适配器) 后进先出序列
queue 队列(适配器) 先进先出序列
set 集合
multiset 可重复集合
map 映射
multimap 可重复映射

--------------------------------------------------------------------------------------------------------------

#include <vector>

 

二维向量vector<vector<int>>在VC下的使用技巧



随着对c++学习的逐步加深,发现STL确实是个好东西。vector是我用到的第一个STL容器,它一直吸引我学习和使用STL。但当我用到二维的vector时(比如vector<vector<int>>),却发现似乎不能用。我用的VC6就是不认它,竟报“error C2146: syntax error : missing ',' before identifier”。凭直觉,我觉得这不应该。网上一搜,类似这样的用法的代码比比皆是。看来是VC6太弱了,竟然不理解vector<vector<int>>为何物!无奈之下只能暂时放弃,另谋它途。然而一直耿耿于怀。

   今天为了写一个算法,又要用到二维向量。这次决定追根究底。搜索了大半天,所有相关的文章、帖子都仔细地看了,终于在一个讨论“error C2653: 'std' : is not a class or namespace name”的问题的帖子中找到了答案。

那位达人说要在VC中用二维向量唯一的解决之道就是把它写成以下形式:

vector < vector < int > /**/ >
   经过测试,把/**/换成空格也可以,也就是只要不影响词法语法,最后两个 ' > ' 之间添加上一些东东把它们分开即可。

   VC中要这样,而其他编译器中就不用?原因 难道是">>"运算符的优先级高的缘故?

   总之,这种用法记住就好!!

更多 0
 
 

vc 使用容器 deque
deque是标准模板库中的内容和vector一样,deque是双端队列.
 

函数                               描述 
c.assign(beg,end)        将[beg; end)区间中的数据赋值给c。
c.assign(n,elem)         将n个elem的拷贝赋值给c。
 
c.at(idx)         传回索引idx所指的数据,如果idx越界,抛出out_of_range。 
c.back()                  传回最后一个数据,不检查这个数据是否存在。 
c.begin()                传回迭代器重的可一个数据。 
c.clear()                移除容器中所有数据。
deque<Elem> c            创建一个空的deque。
deque<Elem> c1(c2)       复制一个deque。
Deque<Elem> c(n)         创建一个deque,含有n个数据,数据均已缺省构造产生。
Deque<Elem> c(n, elem)   创建一个含有n个elem拷贝的deque。
Deque<Elem> c(beg,end)   创建一个以[beg;end)区间的deque。
c.~deque<Elem>()         销毁所有数据,释放内存。
c.empty()                判断容器是否为空

c.end()                  指向迭代器中的最后一个数据地址。
  
c.erase(pos)             删除pos位置的数据,传回下一个数据的位置。
c.erase(beg,end)         删除[beg,end)区间的数据,传回下一个数据的位置。
 
c.front()               传回地一个数据。 
get_allocator           使用构造函数返回一个拷贝。 
c.insert(pos,elem)      在pos位置插入一个elem拷贝,传回新数据位置。
c.insert(pos,n,elem)    在pos位置插入>n个elem数据。无返回值。
c.insert(pos,beg,end)   在pos位置插入在[beg,end)区间的数据。无返回值。
c.max_size()            返回容器中最大数据的数量。 
c.pop_back()            删除最后一个数据。 
c.pop_front()           删除头部数据。 
c.push_back(elem)       在尾部加入一个数据。 
c.push_front(elem)      在头部插入一个数据。 
c.rbegin()              传回一个逆向队列的第一个数据。 
c.rend()                传回一个逆向队列的最后一个数据的下一个位置。 
c.resize(num)           重新指定队列的长度。 
c.size()                返回容器中实际数据的个数。 
C1.swap(c2)             将c1和c2元素互换。
Swap(c1,c2)             同上操作。
 
Deque操作
operator[] 返回容器中指定位置的一个引用。
 
引用:
#include <deque>  /*#include <vector>*/
using namespace std;
 
声明:
std::deque<CClass_A>m_p1;
 
使用:
m_p1.push_back(message);
m_p1.front();
m_p1.pop_front ();
m_p1.size();
 
容器 vector 是动态分配空间,作为管理动态数组的优先选择
1) max_size()
返回 vector<T> 理论上可以装的最多 T 的个数。这只是一个理论上的数字, 大概是 4GB/sizeof(T),没有多大实用价值。在程序中不要用。
2) size()
返回 vector<T> 中实际装的 T 的个数。相当于 CArray<>::GetSize()。
3) empty()
如果 vector<T> 中没有任何 T 对象,返回 true。也就是返回 size() == 0。
4) clear();
清除 vector<T> 中的所有 T 对象。执行后 empty() 返回 true。大致相当于 resize(0),但不要求 T 可被缺省构造。相当于 CArray<>::RemoveAll()。
5) resize( size_t n, T t = T() );
将 vector 中的元素个数设置为 n,n 可以大于 size() 也可以小于 size。如果 n 小于 size(),那么 vector 中下标为 n..size()-1 的元素都将被解构。如果 n > size(),那么将在 vector 的后面新增加
n - size() 个相同的元素 t。在增大 vector 时,可能发生存储再次分配。总之,调用resize( n, t ) 后,(size() == n) 成立。
请注意,如果调用 resize( n ) 不带参数 t ,那么 T 必须可以缺省构造。
6) reserve( size_t n );
事先分配至少可以保存 n 个 T 对象的空间。调用后 (capacity() >= n)成立。
7) capacity();
返回已经分配的存储空间够容纳的 T 类型对象的个数。后续的增加元素操作(如 push_back(), insert())如果增加元素后 vector 中的总元素个数不超过 capacity(),那么 vector 的实现保证不重新分配存储空间。
 
v.push_back( i );
 
// 删除 49, 48:
v.pop_back();
v.pop_back();
   
// 全部删除:
v.clear();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值