限り、データ構造とアルゴリズムのための学校、要約、私たちはこの時間の間に学習成果を見て道に来ることが必要です。データ構造C ++言語自体は、例を提供します。あなたはこれらの13のデータ構造をマスターすることができれば、我々は苦労されていない他の言語を学ぶことを信じています。
配列array
あなたのサイズを知っている必要があり、配列の初期化時には、フォローアップは、その大きさを変更することはできません、インデックスでインデックスに保存されている要素を取得することができます。C ++ソースコードでは、実際Cに基づいて、アレイにパッケージされ、によって知ることができます。
書式#include <配列>
ボイドtestArray(){
//配列を作成します。
std ::アレイ<整数、5> A = {2、4、6、8、10}。
//配列をトラバース
用(CONST自動I:A){
std :: coutの<< I <<はstd ::てendl;
}
以下のために(INT i = 0; i)は(a.sizeを<; iは++します){
std :: coutの<< [i]は<<はstd ::てendl;
}
// [インデックス]を取得することにより、最初の値をとります
std :: COUT << "[0] =" << [0] <<はstd :: ENDL。
//配列の最初の値を変更
[0] = 5。
/ **
インデックスは、クロスボーダーであろうかどうかではないので、クロスボーダーがクラッシュし、[インデックス]をチェックします。
libcの++ abi.dylib:タイプSTDのキャッチされない例外で終了:: out_of_range:配列::で
* /
a.at(0)。
//配列が空の場合
a.empty();
//配列の長さを見つけます
std :: COUT << "a.size()=" << a.size()<<はstd :: ENDL。
//最初の4つの値を取得
int型の値=のstd :: GET <4>(A);
std :: COUT << "(4)=" <<値<<はstd :: ENDL。
//空の配列を作成し、配列は値0または値を持つ他のタイプと同じです
std ::配列<整数、5> A2。
std :: COUT << "エンドA2" << A2 [0] <<はstd :: ENDL。
//配列に2つの要素を比較するかどうか等しいです
IF(==のA2){}
}
可変配列、ベクトルベクトル
C ++では、配列変数として格納されているベクターを用いて、その容量を動的場合、アレイのサイズ初期化が決定される必要はなく、変更することができます。そして、基本的には、アレイで使用するのと同じ方法。
書式#include <ベクトル>
//ベクトル
ボイドテストベクトル(){
/ **
ベクター<T>それとは異なる配列は、そのサイズが可変です
* /
std ::ベクトル<はstd :: string>にV;
//、容器の容量を増大させる、少なくとも20個の受光素子
v.reserve(20)。
//ベクトルを初期化します
std ::ベクトル<整数> V2 = {2、4、5、7}。
//はベクトルに配列を初期化
std ::アレイ<スタンダード::文字列、5>単語{ "1"、 "2"、 "3"、 "4"、 "5"}。
std ::ベクトル<スタンダード:: string>にwords_copy {STD ::開始(単語)のstd ::端(ワード)}。
//取得またはVで要素を変更[インデックス]
std :: COUT << "V [0] =" << V2 [1] <<はstd :: ENDL。
//最初の要素を取得します。
std :: COUT << "v.front()=" << v2.front()<<はstd :: ENDL。
//挿入端9の値
v2.push_back(9)。
//挿入端2の値
v2.emplace_back(2)。
//最初の要素を削除し、渡された値は、イテレータです
v2.erase(v2.begin())。
//長さ
v2.size();
//すべての要素を削除します
v2.clear();
//最後の要素を取り除きます
v2.pop_back();
//の末尾に要素を挿入
v2.insert(v2.end()、3)。
}
二重リンクリスト一覧
二重前部を示すポインタとノードの後のノードを有するリストを連結。それ自体はC ++は、双方向リンクリストを提供します。
書式#include <リスト>
ボイドtestlistという(){
リストの<string>単語{ "こんにちは"、 "リスト"}。
//ヘッダ挿入要素
words.push_front( "push_fron");
words.emplace_front( "emplace_front");
//尾を挿入
words.push_back( "一back");
words.emplace_back( "emplace_back");
//指定された場所を挿入
words.insert(words.begin()++、 "挿入")。
//要素を削除
words.remove( "push_fron");
//イテレータを通じて、リストの要素にアクセスするには
リスト<文字列> ::イテレータbeg_iter = words.begin();
リスト<文字列> ::イテレータend_iter = words.end();
裁判所未満<< "beg_iter:" << * beg_iter <<てendl;
裁判所未満<< "end_iter:" << * end_iter <<てendl;
{(語自動A)のための
coutの<< <<てendl;
}
}
単独リンクリストforward_list
唯一の単一のリストポインタポイントは、次のノードに、単独リンクリストの前に、私たちは算数の問題の多くを行います。
書式#include <forward_list>
ボイドtestForwardList(){
forward_list <ストリング>フィールド・リスト{ "名前"、 "lefe"、 "ハロー"}。
//そのサイズを計算
自動カウント=距離()フィールド・リスト(開始、終了(フィールド・リスト));
裁判所未満<< "サイズ:" <<回数<<てendl;
//頭を挿入
flist.push_front( "before3");
//頭の中に挿入します
flist.insert_after(flist.begin()、 "before2");
//ヘッドノードの前に挿入
flist.insert_after(flist.before_begin()、 "before1");
//単独リンクリストトラバーサル
{(フィールド・リストオートワード)のために
coutの<<単語<<てendl;
}
}
キューキュー
キューは、達成するために、「両端キュー」の使用を基礎となるFIFOデータ構造体、C ++です。キューについての詳細は、この内容を参照することができ 、円形のキューのグラフィックデザインを。
書式#include <キュー>
ボイドtestQueue(){
キュー<整数>秒;
//チームへ
s.push(1)。
//チーム
s.pop();
//ファーストチーム
s.front();
//尾
s.back();
//チームの規模
s.size();
}
両端キュー両端キュー
両端キューチームは、頭と尾の要素上で動作することができます。アルゴリズム設計を行うことで、私たちは、両端キューの両端キューグラフィックデザインを持っていました。
ボイドtestDeque(){
//は空の両端キューを初期化します
そして<整数> my_deque。
// 2つの要素を含む両端キューを初期化します
両端キュー<ストリング> name_queue { "lefe"、 "WSY"}。
COUT << "[0] =" << name_queue [0] << ENDL。
//ヘッド素子をゲット
COUT << "正面=" << name_queue.front()<< ENDL。
//尾の要素を取得
COUT << "バック=" << name_queue.back()<< ENDL。
//尾からチームへ
name_queue.push_back( "BX")。
name_queue.pop_front();
}
プライオリティキューPRIORITY_QUEUE
通常の要素として、キューとキューは唯一の尾に挿入することができ、優先度、要素のチームヘッドの削除が、それは機能チームを持っているにかかわらず、チームのためにチームのための、常に最大の要素の最優先事項です。Cでのボトム++達成するための「スタック」を使用して、その時の複雑さはO(LOGN)で制御することができます。
ボイドtestPriorityQueue(){
//プライオリティキューを作成します。
PRIORITY_QUEUE <整数> Q;
//キューに要素を追加
q.push(4)。
q.push(1)。
以下のために(INT i = 0; iがq.sizeを()<; iは++します){
COUT << q.top()<< ENDL。
//最初の要素を削除します
q.pop();
}
//キューが空の場合
q.empty();
}
ヒープヒープ
ヒープは完全2分木である、ノードの値は常に親ノード(大根ヒープ)の値よりも大きい場合、あなたはヒープを表現するために、配列を使用することができ、C ++は、デフォルトでは、大きなルートヒープで提供します。ヒープソートでは、我々は詳細にヒープを導入しています。 ヒープソート-ソート6/10示し(件名書き込み)。この記事では、我々は書くために、ヒープの手を実装し、「ヒープを。」
C ++のスタックアルゴリズムを通じて紹介する#include <アルゴリズム>が必要です
書式#include <アルゴリズム>
ボイドtestHeap(){
ベクター<整数>番号{6、20、7、3、5}。
/ * **決意方法/
// make_heap(numbers.begin()、numbers.end()、[](INT A、INT B){<Bを返します;});
//値の、数値要素ヒープを作成した後:20,6,7,3,5、大型根ヒープ
make_heap(numbers.begin()、numbers.end()、[](INT A、INT B){<Bを返します;});
//ヒープに要素を追加
numbers.push_back(40)。
//リストラヒープ:40,6,20,3,5,7大きな根ヒープは、push_heap以前vertorヒープを呼び出すようにしてください
push_heap(numbers.begin()、numbers.end())。
//テール要素番号に除去する必要があるが自動的に削除されていないヒープ要素の上部を取り外します
pop_heap(numbers.begin()、numbers.end())。
numbers.pop_back();
}
スタックスタック
積層後下地使用両端キューを達成するために、高度なC ++のデータ構造です。最小スタックアルゴリズムの前に、私たちは、このデータ構造の詳細を提示します。 最小スタック(LeetCode155。最低示し スタック)。
書式#include <スタック>
ボイドtestStack(){
スタック<整数>秒;
s.push(1)。
s.pop();
COUT << "トップ=" << s.top()<< ENDL。
s.size();
}
マッピングマップ、unordered_map
マップは、キーがユニークで、キーとvauleを格納したデータ構造です。C ++は、秩序あるマップや障害マップ「unordered_mapを。」を提供します
書式#include <unordered_map>
書式#include <マップ>
ボイドtestMap(){
//初期化
地図<文字列、文字列> M。
ペア<マップ<文字列、文字列> ::イテレータ、ブール値> ret_iter =
m.insert(ペア<文字列、文字列>( "名前"、 "lefe"));
IF(ret_iter.second ==偽){
裁判所未満<<「名前が存在していた」<<てendl;
}
//初期化
地図<整数、文字列> M2 = {
{2014 "IOSの"}、
{2015、 "アンドロイド"}、
}。
//単一の値を挿入
M [ "名" = "WSY"。
//挿入した多値
m.insert({{ "年齢"、 "20"}、{ "から"、 "NMG"}})。
COUT << "サイズ=" << m.size()<< ENDL。
//イテレータを削除
m.erase(m.begin())。
//検索
地図<文字列、文字列> ::イテレータfind_iter = m.find( "から")。
もし(find_iter!= m.end()){
coutの<< <<てendlを "見つけます";
}
//トラバース、キーを注文されました
{(M対<文字列、文字列> V)のために
coutの<< v.first << "=" << v.second <<てendl;
}
//すべての要素を削除します
m.clear();
}
ペア
格納された値の二組、これら2つのタイプの値は、それが異なっていてもよく、任意のタイプであってもよいです。第一及び第二の対応する値を取得します。
ボイドtestPair(){
対<文字列、文字列> P = { "名前"、 "lefex"}。
//第一及び第二を通して第一及び第二の値を得るために
coutの<< p.first。
coutの<< p.second。
}
タプルタプル
これは拡張バージョン一対の要素の複数の異なる種類を記憶することが可能です。
ボイドtestTuple(){
対<文字列、文字列> P = { "名前"、 "lefe"}。
//タプル、型を作成<strinng、int型、ダブル、ペア>
オートmy_tuple = make_tuple( "名前"、20、10.3、P)。
//最初の要素を取得します。
裁判所未満<< "0 =" <<取得<0>(my_tuple)<<てendl;
// 2番目の要素を取得します。
COUT << "1 =" <<取得<1>(my_tuple)<< ENDL。
}
コレクションセット
コレクションは、そのは、前回の記事で、我々は二分探索木で設定されて実現、平衡二分木を達成根底に基づいて、同じ記憶素子にすることはできません。BSTの使用が設定を実現します。また、順不同のセット提供しながら、C ++でのセットは、注文された「UnorderSetを。」
書式#include <設定>
書式#include <unordered_set>
ボイドTESTSET(){
セット<整数> S {7、3、4}。
s.insert(5)。
// 3,4,5,7
{(SオートV)のために
coutの<< V <<てendl;
}
unordered_set <整数>米国{7、3、4}。
us.insert(5)。
// 7,3,4,5
{:(私たちオートV)について
coutの<< V <<てendl;
}
}
概要
私たちは、C ++言語自体のデータ構造は、線形および非線形構造の構造を提供紹介しました。あなたはAPI Gengshuangを呼び出すときに、これらのデータ構造はまた、ほとんど他の言語で提供しますが、基礎となる実装は基本的に同じである、唯一のこれらのデータ構造原理のすべてを習得するために、追加の言語を学ぶことは、非常に容易になります。