C++11学習シリーズ No.3 ----配列/valarray
プログラミングをする上で、配列の作成は欠かせません。一般的に配列を作成する方法はいくつかあります。
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. などのサードパーティライブラリを呼び出す。 エイジェン の中で
配列の使い方に着目してみましょう。
配列は、一定の大きさを持つ順序付けられた容器です。
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 ;
エラーです。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例