c++ primer笔记之容器

vector

定义
要定义一个向量我们必须包含相关的头文件
#include < vector >
下面都是vector 对象的合法定义
#include < vector >
// 创建vector 对象的各种方法
vector veco; // 空的vector
55 第二章 C++浏览
const int size = 8;
const int value = 1024;
// size 为8 的vector
// 每个元素都被初始化为0
vector vec1( size );
// size 为8 的vector
// 每个元素都被动始化为1024
vector vec2( size, value );
// vtc3 的size 为4
// 被初始化为ia 的4 个值
int ia[4] = { 0, 1, 1, 2 };
vector vec3( ia, ia+4 );
// vec4 是vec2 的拷贝
vector vec4( vec2 );

存储 
vector内部存储为连续型地址空间,内部存储和数组相类似。

内部实现
vector源码位置:D:/Program Files/Microsoft Visual Studio 8/VC/include/vector可以用记事本或者vs打开查看
vector的实现机制大致如下:当capacity不足的(size>capacity)时候,它划分新的连续空间(划分的空间大小呈指数型增长),将以前的内容复制到新的空间中,假如vector中存放的是类的话,则调用类的拷贝构造函数和析构函数。
vector在内部实现insert的时候存在一个临时变量,所以当你插入一个新元素的时候,他多执行的了一次拷贝构造函数。
insert调用了。。_Insert_n(_Where, (size_type)1, _Val);
在_Insert_n里面的语句_Ty _Tmp = _Val;这个需要拷贝构造
void _Insert_n(iterator _Where,
        size_type _Count, const _Ty& _Val)
        {    // insert _Count * _Val at _Where

#if _HAS_ITERATOR_DEBUGGING
        if (_Where._Mycont != this
            || _Where._Myptr < _Myfirst || _Mylast < _Where._Myptr)
            _DEBUG_ERROR("vector insert iterator outside range");
#endif /* _HAS_ITERATOR_DEBUGGING */

        _Ty _Tmp = _Val;    // in case _Val is in sequence
        size_type _Capacity = capacity();

iterator

end()表示的容器最后一个元素的下一个元素,不表示最后一个元素,主要用来进行判断容器是否已经读完。

list iterator不能使用标量(+2),因为list的元素不像vector那样保证相邻。list ::iterator it = ilist.begin()+2;

iterator本身不是指针,它是对指针的封装,所以当它为vector的时候它具有指针的大多数特性。

iterator必须由begin()来初始化,而不是由对vector的某个取址操作。vector ::iterator it = &svec[0];

iterator应该和end()比较而不是和0比较
for ( vector ::iterator
it = svec.begin(); it != 0; ++it )
// ...

我们可以定义一个新的vector 来拷贝svec 的全部或部分元素
int main()
{
vector svec;
// ...
// 用svec 的全部元素初始化svec2
vector svec2( svec.begin(), svec.end() );
// 用svec 的前半部分初始化svec3
vector ::iterator it =
svec.begin() + svec.size()/2;
vector svec3( svec.begin(), it );
// 处理 vectors ...
}

map

定义
#include
为定义map 对象我们至少要指明键和值的类型例如
map word_count;
定义了map 对象word_count 它由string 作为索引并拥有一个相关的int 值类似地
class employee;
map personnel;
定义了map 对象personnel 它由一个int 作为索引代表一个惟一的雇员号并拥有相
248 第六章 抽象容器类型
关联的指向雇员类实例的指针

插入操作
推荐的插入操作如下:(详细见c++primer page248)
word_count.insert(
map ::
value_type( string("Anna"), 1 )
);
或者使用typedef map ::value_type valType;简化操作.

查找
下标操作符给出了获取一个值的最简单方法例如
// map word_count;
int count = word_count[ "wrinkles" ];
但是只有当map 中存在这样一个键的实例时该代码才会表现正常如果不存在这样
的实例使用下标操作符会引起插入一个实例在本例中键/值对
string( "wrinkles" ), 0
被插入到word_count 中count 被初始化为0

有两个map 操作能够发现一个键元素是否存在而且在键元素不存在时也不会引起插入
实例
1 Count(keyValue) count()返回map 中keyValue 出现的次数当然对于map
而言返回值只能是0 或1 如果返回值非0 我们就可以安全地使用下标操作符例如
int count = 0;
if ( word_count.count( "wrinkles" ))
count = word_count[ "wrinkles" ];
2 Find(keyValue) 如果实例存在则find()返回指向该实例的iterator 如果不存在
则返回等于end()的iterator 例如
int count = 0;
map ::iterator it = word_count.find( "wrinkles" );
if ( it != word_count.end() )
count = (*it).second;
指向map 中元素的iterator 指向一个pair 对象其中first 拥有键second 拥有值

删除
从map 中删除元素的erase()操作有三种变化形式为了删除一个独立的元素我们传递
给erase()一个键值或iterator 为了删除一列元素我们传递给erase()一对lieator 例如如
果我们打算让用户能从text_map 删除元素可以这样做
string removal_word;
cout << "type in word to remove: ";
cin >> removal_word;
if ( text_map->erase( removal_word ))
cout << "ok: " << removal_word << " removed/n";
else cout << "oops: " << removal_word << " not found!/n";
另外我们可以在删除单词之前检查它是否存在
map ::iterator where;
where = text_map.find( removal_word );
if ( where == text_map->end() )
cout << "oops: " << removal_word << " not found!/n";
else {
text_map->erase( where );
cout << "ok: " << removal_word << " removed!/n";
}

set

存放单个值,和其他的容器类相似,他们的find()方法当没有找到的时候返回的是对应set.end().

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值