1. ホーム
  2. c++11

C++11学習シリーズ No.3 ----配列/valarray

2022-02-22 01:19:18

プログラミングをする上で、配列の作成は欠かせません。一般的に配列を作成する方法はいくつかあります。

I. C++の組み込み配列

配列のサイズを固定し、高速化

一般的な書式は、「データ型配列名 [ 配列サイズ ]」です。

例:int a[40];//1次元の配列

  int a[5][10];// 2次元配列

次に、vectorは配列を作成します。

様々な汎用アルゴリズムが含まれる

可変長でフレキシブルに使えるが、効率はやや劣る

ベクターはnewとdeleteでメモリ管理

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

}

iii. 配列

array 配列テンプレート , C++11 のみでサポートされています。

一般的な書式: array<typeName, 要素数> arrayName;

長さが固定されているため、ここでの要素数は変数にできないことに注意してください。

固定長は、より良い安全なインタフェースを提供し、組み込み配列と同等の効率で実行され、組み込み配列の効果的な代替となり得る

<pre name="code" class="cpp">include <iostream>
#include <array>   
using namespace std;

void main()
{
	//-----------------------------------------------
	//--This is a 1-dimensional array
	array<int, 5> myarray = { 1, 2, 3, 4, 5 }
	array<int, 5> m=myarray;//support assignment
	array<int, 5> m2(myarray);//support initializing an array with another array
	-----------------------------------------------
	//cout << "myarray=" << endl;
	// for (size_t n = 0; n < myarray.size(); n++){
	// cout << myarray[n] << '\t';
	//}
}









 IV. バラレイ



valarray 数値計算用の配列で、C++11 のみでサポートされています。

配列の和、最大数、最小数など、多くの数値配列演算をサポートしています。

ヘッダーファイルのvalarrayのサポートが必要です

#include <iostream> 
#include <valarray>
using namespace std;

int main()
{
    
    valarray<int> a;// length 0
    valarray<double> g(10);//length 10
    valarray<int> hh(a);
    hh = a;
    valarray<float> h(3.14, 10);//length 10, each element is 3.14
    int days[10]
        = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    valarray<int> b(days, 5);//length 5, initialize valarray with array
    cout << b.sum() << endl;//sum
    cout << b.max() << endl;//maximum
    cout << b.min() << endl;//minimum
    return 0;
}


V. などのサードパーティライブラリを呼び出す。 エイジェン の中で

マトリックスXf a(10,15);
VectorXf b(30)です。

配列の使い方に着目してみましょう。

配列は、一定の大きさを持つ順序付けられた容器です。

template <class T, size_t N>
class array;

<pre name="code" class="cpp">#include <iostream>
#include <array>   
using namespace std;

int main ()
{
	 //-----------------------------------------------
  //--This is a 1-dimensional array
	array<int,5> myarray={1,2,3,4,5};
 //-----------------------------------------------
  cout <<"myarray="<<<endl;
  for (size_t n=0; n<myarray.size(); n++){
	  cout << myarray[n] <<'\t';
  }
  cout << endl;
  //-----------------------------------------------
  //Of course you can also use
  cout <<"myarray="<<endl;
  for (size_t n=0; n<myarray.size(); n++){
	  cout << myarray.at(n) << '\t';
  }
   cout << endl;
 //-----------------------------------------------
  //--This is a 2-dimensional array, with 3 rows and 2 columns
  array<array<int,2>,3 > myarray2D={1,2,3,4,5,6};
  //-----------------------------------------------
  cout <<"myarray2D="<<<endl;
  for (size_t m=0; m<myarray2D.size(); m++){
  	for (size_t n=0; n<myarray2D[m].size(); n++){  	
	  	cout << myarray2D[m][n] <<'\t';
  	} 
   cout << endl; 
  }
  cout << endl;
  //-----------------------------------------------
  
  return 0;
}







// '[]' operation
#include <iostream>
#include <array>

int main()
{
	std::array<int, 10> 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
Please press any key to continue. . .




結果

// data member function: returns a pointer to the first element of the array
#include <iostream>
#include <cstring>
#include <array>

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

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

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

	return 0;
}


Test string
Please press any key to continue. . .



// fill function to set all the elements inside the array to the specified value
#include <iostream>
#include <array>

int main() {
	std::array<int, 6> 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 5
Please press any key to continue. . .
// swap function: swap the contents of two arrays, note that both arrays must be of the same type and the same size
#include <iostream>
#include <array>

int main()
{
	std::array<int, 5> first = { 10, 20, 30, 40, 50 }
	std::array<int, 5> 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
Please press any key to continue. . .


結果

// swap function: swap the contents of two arrays, note that both arrays must be of the same type and the same size
#include <iostream>
#include <array>
#include <vector>
using namespace std;
int main()
{
	 int m = 5, n = 6;
	std::array < array<int, 5>, 6 > a ;

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

	return 0;
}




std::array < array<int, 5>, 6 > a ;


結果

std::array < array<int, m>, n > a ;

上記のarray、vector、valarrayの違いについて詳しく説明しましょう。

基本的にベクトルはバラレイと同じなので、基本的にはベクトルをバラレイに置き換えればよいでしょう。唯一の違いは、valarrayは数値演算に重点を置いているので、max,min,sumなどの関数が追加されていることです。

配列の個数があらかじめ決められていて変更できない点は、組み込みの配列とよく似ています。ただ、配列の方が操作が簡単で、メモリ管理も必要ない。

例えば、2次元の配列を動的に作りたい場合、ベクトルでは可能ですが、配列では不可能です。

// swap function: swap the contents of two arrays, note that both arrays must be of the same type and the same size
#include <iostream>
#include <array>
#include <vector>
using namespace std;
int main()
{
	 int m = 5, n = 6;
	std::array < array<int, 5>, 6 > a ;

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

	return 0;
}


を置くと
std::array < array<int, 5>, 6 > a ;

で置き換える。

std::array < array<int, m>, n > a ;

エラーです。