C++ STL vector, valarray, 和bitSet使用方法对比

 三个容器要数vector是最常用的了,但是什么时候应该使用其他容器呢?下面看看他们的用法比较。

初始化: 

	int b[] = {1,2,3};
	valarray<int> var(b,b+3);//编译不通过
	vector<int> vec(b,b+3);//正确赋值方式
	bitset<16> bits(20);//20转换成2进制存储进bitset容器中 

valarray并不是一个标准的stl容器,因为它本身没有iterators,这就是为什么上面它不可以想vector那样初始化。

 

尽量不要使用vector<bool>这样的容器。

下面程序最后一句是不能通过编译的。

	vector<bool> arr;
	arr.push_back(1);
	arr.push_back(0);
	for (auto x:arr)
	{
		cout<<x<<endl;
	}

	bool *ptr = &arr[0];//编译不能通过

因为&arr[]返回的是使用代理类型,而不是指针地址。

但是下面代码却是可行的:

	valarray<bool> valarr(1,2);
	bool *ptr = &valarr[0];//可行
	cout<<*ptr<<endl;//打印1


但是这个问题,使用bitset也是无法通过编译的:

	bitset<16> bits(8);
	bool *ptr1 = &bits[0];//不能通过编译

valarray是用来存储一个数列,可以快速地作数学操作的,如果需要对数列,尤其正数列所有元素作数学操作,那么就应该选择valarray.如下面的程序:

	valarray<int> valarr(10,2);
	valarray<int>::value_type rval = 10;
	valarr *= rval;//可行

	vector<int> veci(10,2);
	vector<int>::value_type vval = 20;
	veci *= vval;//不可行,无法通过编译。

 

注意valarray和vector两个参数的初始化的结果也是不一样的,如下面程序:

	valarray<int> valarr(10,2);
	for (auto x:valarr)
		cout<<x<<" ";
	cout<<endl;

	vector<int> veci(10,2);
	for (auto x:veci)
		cout<<x<<" ";
	cout<<endl;

同样的参数(10,2),valarray代表2个10,而vector就代表是10个2.
 

 bitset是不支持for (auto x:bits)这样的语句的,而且初始化就是把一个整数转换为二进制,和valarray,vector的初始化都大不一样。

如下面程序:

	vector<int> veci(10,2);
	for (auto x:veci)
		cout<<x<<" ";
	cout<<endl;

	bitset<16> bits(20);
	cout<<bits.size()<<endl;//输出当前的容量
	cout<<bits.count()<<endl;//输出当前有多少个1
	for (int i = 0; i < bits.size(); i++)
	{
		cout<<bits[i]<<" ";
	}
	cout<<endl;
	//for (auto x:bits)//无法通过编译
	//	cout<<x<<" ";
	//cout<<endl;


 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值