詳細6.1ベクトルの一般的な使用
ベクター:可変長アレイのアレイ、必要に応じて自動的に変更の長さ
すなわちする#includeベクター、ヘッダーを追加するためのベクターの必要性、<ベクトル>を使用するように、ヘッダファイルはまたに以下を追加する必要がある「を使用して名前空間std;」
1.vector定義
単一のベクトルを定義します
ベクトル<型名>名前;
型名は任意の塩基の種類、例えばint型、ダブル、チャー、および他の構造であってもよい、セット、キューのような、例えばベクター、標準のSTLコンテナであってもよいです。
時間は型名のSTLコンテナである場合は、>>記号を加えた空間の間に覚えておくことが定義されました。
メソッド定義された配列のベクター:ベクター<型名> Arrayname [ARRAYSIZE]。
そのようなArrayname [0]〜Arrayname [ARRAYSIZE-1]は、各容器のベクトルです。
2.vectorコンテナ要素内のアクセス
添字(1)アクセス
ベクトル<型名> VI。
我々[インデックス]
0からvi.sizeにインデックス() - 1
(2)反復子を介してアクセス可能
ベクトル<型名> ::イテレータそれ:
例えば:
ベクトル<整数> ::イテレータそれ。
ベクトル<ダブル> ::イテレータそれ。
書式#include <cstdioを> する#include <ベクトル> 使用して 名前空間はstdを、 INT メイン(){ ベクトル < int型 > VI。 以下のために(INT iが= 1 ; I <= 5 ; I ++ ){ vi.push_back(I); } ベクトル < int型 > ::イテレータそれは= vi.begin(); 以下のために(INT iは= 0 ; I < 5 ; I ++ ){ printf(" %d個"、*(それ+ I)); } リターン 0 ; }
VI [i]と*(vi.begin()+ i)は等価です
カナダからのイテレータはまた、2つの操作を実装:++それとそれ++
書式#include <cstdioを> する#include <ベクトル> 使用して 名前空間はstdを、 INT メイン(){ ベクトル < int型 > VI。 以下のために(INT iが= 1 ; I <= 5 ; I ++ ){ vi.push_back(I); } 以下のための(ベクトル< int型!;;それ= vi.end()それ++> ::イテレータそれは= vi.begin(){) printf(" %d個"、* それ)。 } リターン 0 ; }
ベクターのみと文字列のみ許可vi.begin()+ 3は、この反復子プラス整数を書き込ま。
一般的に使用される分析関数3.vectorの例
(1)一back(x):xがベクトルの背後に要素を追加し、時間計算量はO(1)であります
(2)pop_back()は:ベクトルの最後の要素を削除し、時間計算量はO(1)であります
(3)サイズ():得られたベクトルの要素数は、時間計算量はO(1)であります
(4)()クリア:クリアベクトルのすべての要素、時間計算量はO(N)であり、Nは、ベクトルの要素数であります
(5)挿入():挿入(I、X)は、時間複雑でそれ反復子任意の要素xベクトルを挿入するために使用されているO(N)であります
(6)消去()は、2つの方法で:個々のアイテムを削除するには、範囲内のすべての要素を削除します。
図1に示すように、単一要素vi.erase(vi.begin()+ 3)を削除し、削除VI [3]
2、セクションは、すべての要素を削除します。vi.erase(vi.begin()+ 1、vi.begin()+ 4); VI削除VI [1]、[2]、VI [3]
4.vectorの一般的な用途
(1)データを格納します
(2)隣接テーブルストレージ図。
PAT A1039学生のためのコース一覧
浙江大学は、40000人の学生を持っており、2500回のコースを提供します。今、すべてのコースの生徒の名前のリストを与え、あなたは出力に、クエリのために来て、各学生のための登録コースのリストを想定しています。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。:各ケースについて、最初の行には2つの正の整数が含ま N(≤)、そのコースのリストを探して、学生の数、および K(≤)、コースの合計数を。その後、生徒の名前のリストは、(1からに番号が付けコースのために与えられる 次の形式でK):各コースのために 私は、最初のコースのインデックスは iと登録学生数 N iは(≤)Aに記載されていますライン。そして、次の行では、 N I 生徒の名前が与えられています。生徒の名前は3つの資本英文字プラス1桁の数字で構成されています。最後に、最後の行が含まれています クエリのために来る学生のN名。行のすべての名前と番号は、スペースで区切られます。
出力仕様:
各テストケースの場合は、内検索結果印刷 Nラインを。最初の増加順に登録した学生のコース、及びコースの最終的指標の総数が、その後、生徒の名前を印刷する次の形式で一人の学生、各ラインに相当します。クエリ結果は、入力と同じ順序で印刷されなければなりません。ライン内のすべてのデータは、行の末尾に余分なスペースを、スペースで区切らなければなりません。
サンプル入力:
11 5
4 7
BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1
1 4
ANN0 BOB5 JAY9 LOR6
2 7
ANN0 BOB5 FRA8 JAY9 JOE4 KAT3 LOR6
3 1
BOB5
5 9
AMY7 ANN0 BOB5 DON2 FRA8 JAY9 KAT3 LOR6 ZOE1
ZOE1 ANN0 BOB5 JOE4 JAY9 FRA8 DON2 AMY7 KAT3 LOR6 NON9
サンプル出力:
ZOE1 2 4 5
ANN0 3 1 2 5
BOB5 5 1 2 3 4 5
JOE4 1 2
JAY9 4 1 2 4 5
FRA8 3 2 4 5
DON2 2 4 5
AMY7 1 5
KAT3 3 2 4 5
LOR6 4 1 2 4 5
NON9 0
#include <cstdioを> する#include <CStringの> する#include <ベクトル> の#include <アルゴリズム> 使用して 名前空間をSTD。 const int型 N = 40010 ; CONST INT M = 26 * 26 * 26 * 10 + 1 。 ベクター < INT > selectCourse [M]。 INTのgetId(チャー名[]){ int型の ID = 0 。 以下のために(INT iは= 0 ; I < 3 ; I ++ ){ ID = ID * 26 +(名前[I] - [ A ' )。 } ID = ID * 10 +(名[ 3 ] - ' 0 ' )。 戻り値のID。 } INT メイン(){ チャー名[ 5 ]。 整数N、K。 scanf関数(" %D%D "、&N&K)。 以下のために(INT iが= 0 ; I <K; I ++ ){ int型もちろん、X。 scanf関数(" %D%D "、&もちろん、&X) 用(int型 J = 0 ; J <X; J ++ ){ scanf関数(" %sの" 、名); INT ID = のgetId(名); selectCourse [ID] .push_back(コース)。 } } 以下のために(INT iが= 0 ; N I <; Iは++ ){ scanf関数(" %sの" 、名); INT ID = のgetId(名); ソート(selectCourse [ID])(.begin、selectCourse [ID] .END())。 printf(" %sの%D " 、名前、selectCourse [ID] .size())。 用(INT J = 0 ; J <selectCourse [ID] .size(); J ++ ){ printf(" %dの" 、selectCourse [ID] [J])。 } printf(" \ n個" ); } リターン 0 ; }