C++11系列学习之三----array/valarray

创建数组,是程序设计中必不可少的一环。我们一般可以有以下几种方法来创建数组。

一、C++内置数组

数组大小固定,速度较快

通用格式是:数据类型   数组名[ 数组大小 ];

如 int a[40];//一维数组

  int a[5][10];//二维数组

二、vector创建数组

包含多种通用算法

长度可变,使用灵活,但效率稍低

vector是使用 new 和 delete 来管理内存的

#include 
#include 
using namespace std;
int main()
{
	int n;
	cin >> n;
	vector colors(n);
	cout << "array colors's length is " << colors.size();
	vector weekdays;
	weekdays.push_back(2);
	system("pause");
	return 0;

}
三、array

array 数组模板 ,在C++11中才支持

通用格式:array<类型名, 元素个数>  数组名;

注意,因为长度固定,这里的元素个数不能是变量。

长度固定,提供了更好、更安全的接口,执行效率和内置数组相同,可以有效替代内置数组

include 
#include    
using namespace std;

void main()
{
	//-----------------------------------------------
	//--这是1维数组
	array myarray = { 1, 2, 3, 4, 5 };
	array m=myarray;//支持赋值
	array m2(myarray);//支持用一个数组去初始化另一个数组
	-----------------------------------------------
	//cout << "myarray=" << endl;
	//for (size_t n = 0; n < myarray.size(); n++){
	//	cout << myarray[n] << '\t';
	//}
}


 四、valarray 
  

valarray 面向数值计算的数组,在C++11中才支持

支持很多数值数组操作,如求数组总和、最大数、最小数等。

需要头文件 valarray 支持

#include  
#include 
using namespace std;

int main()
{
    
    valarray a;//长度为0
    valarray g(10);//长度为10
    valarray hh(a);
    hh = a;
    valarray h(3.14, 10);//长度为10,每个元素为3.14
    int days[10]
        = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    valarray b(days, 5);//长度为5,用数组初始化valarray
    cout << b.sum() << endl;//总和
    cout << b.max() << endl;//最大值
    cout << b.min() << endl;//最小值
    return 0;
}

五、调用第三方库,如Eigen中的

MatrixXf a(10,15);
VectorXf b(30);

下面我们重点谈一下array的用法。

Array 是一种大小固定的顺序容器。array 的申明:

template <class T, size_t N>
class array;

#include 
#include    
using namespace std;

int main ()
{
	 //-----------------------------------------------
  //--这是1维数组
	array myarray={1,2,3,4,5};
 //-----------------------------------------------
  cout <<"myarray="< 

// ‘[]’ 操作
#include 
#include 

int main()
{
	std::array myarray;
	unsigned int i;

	// assign some values:
	for (i = 0; i < 10; i++) myarray[i] = i * 10;

	// print content
	std::cout << "myarray contains:";
	for (int &i : myarray)
		std::cout << " " << i;

	std::cout << std::endl;

	return 0;
}
结果:

myarray contains: 0 10 20 30 40 50 60 70 80 90
请按任意键继续. . .

// data 成员函数:返回指向array第一个元素的指针
#include 
#include 
#include 

int main()
{
	const char* cstr = "Test string";
	std::array charray;

	memcpy(charray.data(), cstr, 12);

	std::cout << charray.data() << std::endl;

	return 0;
}
结果:

Test string
请按任意键继续. . .


// fill 函数,设置array内部的所有元素为指定值
#include 
#include 

int main() {
	std::array myarray;

	myarray.fill(5);

	std::cout << "myarray contains:";
	for (int& x : myarray) { std::cout << " " << x; }

	std::cout << std::endl;

	return 0;
}

结果:

myarray contains: 5 5 5 5 5 5
请按任意键继续. . .
// swap 函数:交换两个array的内容,注意两个array必须是相同类型,相同大小
#include 
#include 

int main()
{
	std::array first = { 10, 20, 30, 40, 50 };
	std::array second = { 11, 22, 33, 44, 55 };

	first.swap(second);

	std::cout << "first:";
	for (int& x : first) std::cout << " " << x;
	std::cout << std::endl;

	std::cout << "second:";
	for (int& x : second) std::cout << " " << x;
	std::cout << std::endl;

	return 0;
}

结果:

first: 11 22 33 44 55
second: 10 20 30 40 50
请按任意键继续. . .
下面我们再说说以上array、vector、valarray的区别。

本质上,vector与valarray是相同的,基本上将vector换成valarray即可。无非是valarray侧重于数值运算,因此增加了max,min,sum等函数。

而array与内置数组很接近,它的个数是事先给定的,不能更改。只不过是array更容易操作而已,也不用管理内存。

比如:我们想要动态创建二维数组,vector可以,但array不可以。

// swap 函数:交换两个array的内容,注意两个array必须是相同类型,相同大小
#include 
#include 
#include 
using namespace std;
int main()
{
	 int m = 5, n = 6;
	std::array < array, 6 > a ;

	vector > ivec;
	ivec.resize(m, vector(n));

	return 0;
}

当我们将
std::array < array, 6 > a ;
换成

std::array < array, n > a ;
出错。


你可能感兴趣的:(c++11)