C/C++面试:容器的元素可以声明引用类型吗?

1059 篇文章 285 订阅

答案

不能

原因

#include <vector>
#include <boost/shared_ptr.hpp>

using namespace std;

class test {};
typedef boost::shared_ptr<test> test_ptr;

int main()
{
    vector<test> tmp;
    vector<test*> tmp1;    //小心内存泄露,重复析构等问题
    //vector<test&> tmp;    //直接编译通不过
    vector<test_ptr> tmp2;
    //vector<test_ptr&> tmp3;  //即使是boost的智能指针的引用也不行

    return 0;
}

c++ 的 STL 中主要有 vector , list, map, set , multimap,multiset ,这些容器都要求元素类型满足以下2种情况:

  • 能被复制:
    • 将数据放入容器的过程就是通过数据的复制构造函数在容器内创建数据的一个副本的过程。这要求容器使用的元素类型可以被复制
    • 也就是说类类型需要复制构造函数的支持
  • 能被赋值:
    • 在使用容器的删除、查找、访问、使用迭代器修改元素等许多情况下,都需要元素的赋值操作支持,
    • 也就是说类类型需要赋值操作符运算的支持

vector、list 中的单参数的resize 操作需要默认初始化指定个数的元素,类类型需要无参数的默认构造函数支持初始化。

set、multiset, map和multimap中的键类型、 list 中的sort 操作 都需要 < 比较操作来排序,类类型需要 < 操作符运算的支持。

在STL中,容器的元素要满足三个基本要求:可拷贝(copyable)、可赋值(assignable)、可析构(destroyable)。基本数据类型和自定义的类都满足这些条件,但是引用不满足,因为引用不能析构

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值