C++学习笔记八-顺序容器(一)

三、容器元素的初始化:

      1.将一个容器初始化为另一个容器的副本:当不使用默认构造函数,而是用其他构造函数初始化顺序容器时,必须指出该容器有多少个元素,并提供这些元素的初值。同时指定元素个数和初值的一个方法是将新创建的容器初始化为一个同类型的已存在容器的副本:

?
1
2
3
4
vector< int > ivec;
vector< int > ivec2(ivec);   // ok: ivec is vector<int>
list< int >   ilist(ivec);   // error: ivec is not list<int>
vector< double > dvec(ivec); // error: ivec holds int not double</double></int></int></int></int></int>

         将一个容器复制给另一个容器时,类型必须匹配:容器类型和元素类型都必须相同。

 

      2.初始化为一段元素的副本:

           A.迭代器标记了要复制的元素范围,这些元素用于初始化新容器的元素。迭代器标记出要复制的第一个元素和最后一个元素。采用这种初始化形式可复制不能直接复制的容器。更重要的是,可以实现复制其他容器的一个子序列:

?
1
2
3
4
5
6
// initialize slist with copy of each element of svec
list slist(svec.begin(), svec.end());
// find midpoint in the vector
vector::iterator mid = svec.begin() + svec.size()/2;
// initialize front with first half of svec: The elements up to but not including *mid
deque front(svec.begin(), mid);

          B.回顾一下指针,我们知道指针就是迭代器,因此允许通过使用内置数组中的一对指针初始化容器也就不奇怪了:   

?
1
2
3
4
5
char  *words[] = { "stately" , "plump" , "buck" , "mulligan" };
// calculate how many elements in words
size_t  words_size = sizeof (words)/ sizeof ( char  *);
// use entire array to initialize words2
list words2(words, words + words_size);

其中第二个指针提供停止复制的条件,其所指向的位置上存放的元素并没有复制。    

       3.分配和初始化指定数目的元素:      

          A.创建顺序容器时,可显式指定容器大小和一个(可选的)元素初始化式。容器大小可以是常量或非常量表达式,元素初始化则必须是可用于初始化其元素类型的对象的值:     

?
1
2
const  list< int >::size_type list_size = 64;
list<string> slist(list_size, "eh?" ); // 64 strings, each is eh?</string></int>

         B.不提供元素初始化式时,标准库将为该容器实现值初始化。采用这种类型的初始化,元素类型必须是内置或复合类型,或者是提供了默认构造函数的类类型。如果元素类型没有默认构造函数,则必须显式指定其元素初始化式。

    接受容器大小做形参的构造函数只适用于顺序容器,而关联容器不支持这种初始化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值