表紙:今年も4月です。過去、今年のこの時期、ブルーブリッジ地方大会は早期に終了しました。今年は、新しいクラウンウイルスの影響で、大学入学試験のブルーブリッジレベル4、6が延期されました。前例のないことでしょう。誰も来ないことを願っています!今年のブルーブリッジの延期により、まだ学校が始まっておらず、準備時間が非常に長いです。最近遊んでいますので、落ち着いてブログに来てください。STLは、日常のコード問題データ構造問題におけるコードの量を大幅に削減できます。単一の関数で、並べ替え、重複排除、および完全な配置を解決できます。
トピック:Blue BridgeCupコンペティションでC ++でSTLコンテナと関数を上手に使用する
一般的に使用されるSTLコンテナはいくつかあると思います:queue、set、vector、string
一般的に使用されるSTLアルゴリズムには、sort、next_permutation、prev_permutation関数があります。
目次
トピック:Blue BridgeCupコンペティションでC ++でSTLコンテナと関数を上手に使用する
6つのnext_permutationおよびprev_permutation関数
1つ、キューコンテナ
キュー-内部の要素はfirst-in-first-outの対象になります。一般的に、123456を順番に並べます。取り出しても、順番は123456のままです。これはGuangsouを書くときに広く使用されています(最初にポイントまでトラバースし、次に優先順位を付けるためにトラバースします)。彼はバケツと考えることができます。今日は何かを投げます。それを手にしたときに最初に手に入るのは、最初に投げたものです。
一般的な操作方法:
最初にヘッダーファイルを引用する必要があります:#include <queue>
キューを定義します(山括弧内はキュー内の要素のタイプです。多くのタイプがあり、構造も使用でき、一般的に使用されます):queue <int> q;
要素を挿入します:q.push(a);
ヘッド要素に戻ります:q.front();
リーダー要素をポップします: q.pop();
クエリキューの長さ: q.size();
キューが空であるかどうかを照会します(boolタイプの戻り値がtrueまたはfalse):q.empty();
テール要素をクエリします:q.back();
注意:
(1)C ++である必要があり、namespacestdを使用します。
(2)ヘッダーファイルは引用符で囲む必要があります:#include <queue>
(3)チームの最初の要素を取得した後、チームの最初の要素がポップアップする必要があります。そうしないと、常に彼を取得します。フェッチは単なる値であり、バケットから取り出されることはなく、その背後にある要素が出てくる可能性があります。
例:
#include <stdio.h>
#include <queue>
using namespace std;
int main()
{
queue<int >q; //定义存储类型为int的队列
int x;
printf("输入五个整数:");
for(int i = 1;i<=5;i++)
{
scanf("%d",&x);
q.push(x); //每个x都入队
}
printf("全部出队为:\n");
while(!q.empty()) //当q不为空时
{
printf("%d ",q.front()); //输出队首元素
q.pop(); //弹出队首元素,队列长度减小
printf("队列现在的大小:%d\n",q.size());
}
return 0;
}
試運転:
二、セットコンテナ
セットには機能があり、その中の要素は一度だけ表示されます。つまり、入力した要素は繰り返されません。繰り返しを配置したい場合は、セットされません。この機能を効果的に使用できます。重りを取り除く。さらに、セットに入る要素は自動的に辞書に分類されます。このセットトラバーサルは、内部要素へのポインターであるイテレーターを使用します。
一般的な操作方法:
特定の値の要素の数を返します。count();
コレクションが空の場合は、trueを返します。empty();
イテレーターを最後の要素に戻します:end();
最初の要素を指すイテレーターを返します:begin();
コレクション内の要素を削除します:erase();
見つかった要素を指すイテレーターを返します:find();
コレクションに要素を挿入します:insert();
コレクション内の要素の数:size();
例:
#include <stdio.h>
#include <set>
using namespace std;
int main()
{
set<int >s; //定义存储类型为int的set
int x;
printf("输入五个整数:");
for(int i = 1;i<=5;i++)
{
scanf("%d",&x);
s.insert(x); //每个x放入set容器
}
if (s.find(3)!=s.end()) //查找元素3
printf("Y\n");
else
printf("N\n");
s.erase(3); //删除元素3
if (s.find(3)!=s.end()) //再次查找元素3
printf("Y\n");
else
printf("N\n");
printf("%d\n",s.size()); //容器大小
printf("遍历set容器:\n");
for (set<int>::iterator it = s.begin(); it != s.end(); it++) //迭代器遍历容器
{
printf("%d",*it);
}
return 0;
}
試運転:
3、ベクトルコンテナ
配列の使用法と同様に、添え字を直接使用して値を取得できますが、添え字を使用して値を割り当てることはできません。!!特徴は、関連する関数を使用して配列のサイズとそれが空かどうかを計算することです。
一般的な操作:
vコンテナを定義します。
vector <T> v1; // vevtorはタイプTのオブジェクトを保存します。デフォルトの構成v1は空です。
vector <T> v2(v1); // v2はv1のコピーであり、v1とv2の要素タイプは同じである必要があります
vector <T> v3(n、i); // v3には値iのn個の要素が含まれます
vector < T> v4(n); // v4には初期化された要素のn個のコピーが含まれ、デフォルトの要素値は0です。
xをコンテナに入れます:push_back(x);
コンテナサイズ:size();
コンテナは空です:empty();
例:
#include <stdio.h>
#include <vector>
using namespace std;
int main()
{
vector<int >v; //定义存储类型为int的v
int x;
printf("输入五个整数:");
for(int i = 1;i<=5;i++)
{
scanf("%d",&x);
v.push_back(x); //每个x放入v容器
}
for(int i=0;i<v.size();i++) //遍历v的大小
{
printf("%d\n",v[i]);
}
return 0;
}
試運転:
4、ストリングコンテナ
char配列に似ていますが、より使いやすく、関連する関数を直接加算および減算または使用できます。
一般的な操作:
sコンテナを定義し
ます。strings1; //文字列を初期化します。s1は空です
strings2 = s1;?//初期化をコピーし、s1をs2にコピーし
ますstring s3 = "test"; //直接初期化、s3は "test"
string s4 (10、 'a'); // s4 = "aaaaaaaaaa"
string s6( "test"); //直接初期化
文字列スプライシング:直接加算および減算:s + = "xxxx"; s + = s1;
文字列検索:検索( "te");
0-2位置置換:replace(0、2、 "tt");
s1、s2を比較:s1.compare(s2)
1-3位置を取得substring:substr(1、3);
挿入位置3の前:insert(3、 "tt");
位置0-2の文字を削除します:erase(0、2);
例:
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s = "0123456"; //定义s
string s2 = "789"; //定义s2
cout<<s.find("34")<<endl; //在s查找"34"
cout<<s.compare(s2)<<endl; //比较s和s2
s.replace(0, 2, "***");//替换
cout<<s<<endl;
string s3 = s.substr(1, 3);//取子串
cout<<s3<<endl;
s.insert(5, "---");//插入
cout<<s<<endl;
s.erase(0, 4);//删除
cout<<s<<endl;
s+=s2;//叠加
cout<<s<<endl;
return 0;
}
試運転:
5、<algorithm>のソート機能
デフォルトの辞書の昇順
ソート機能、デフォルトの昇順ソート、時間の複雑さn * lg(n)は、最適化されたクイックソートに属します
指示:
a [0]からa [9]を昇順で並べ替えます。sort(a、a + 10);
例:
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a[110] = {1,3,5,8,7,4,1,2,3,6,9,8,0};
sort(a,a+10);
for(int i=0;i<13;i++)
cout<<a[i]<<" ";
return 0;
}
試運転:
cmpを使用して、ソートタイプをカスタマイズします。
単純な昇順の並べ替えではすべての人のニーズを満たすことができないため、パラメータ受け渡し関数cmpを単語sortの3つのパラメータとして書き直して、並べ替え方法をカスタマイズできます。構造の並べ替えなど、関数の記述方法は多数あります。構造の特定の要素を使用して、並べ替えなどを行うことができます。
例:
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp1(int a,int b)//传参为排序数据类型
{
return a>b;//降序排列(你需要的排序规则)
}
int main()
{
int a[110] = {1,3,5,8,7,4,1,2,3,6,9,8,0};
sort(a,a+10,cmp1);
for(int i=0;i<13;i++)
cout<<a[i]<<" ";
return 0;
}
試験結果:
<algorithm>の6つのnext_permutation関数とprev_permutation関数
2つの完全な順列関数、nextは次の順列、prevは前の順列、およびパラメーターに従って字句順列を実行します。
注:この関数を使用する前に、渡すデータが単調であることを確認する必要があります(sort()を使用できます)。そうでない場合、不完全になります。!!!
説明:たとえば、パラメーター「231」をnextに渡すと、「123」シーケンスが彼の上にある間、彼は語彙の順序で次の順序を見つけ、このシーケンスはトラバースされません!!!
指示:
do-whileを使用し、関数をwhileに入れ、処理ステートメントをdoに入れます。ソートされたシーケンスは元の配列にまだ存在し、次の辞書の配置に進みます。、、、doでは配列要素を実行できないことに注意する必要があります。割り当ては次の完全な行に影響するため、割り当ておよびその他の操作は値のみを取ることができます。!!!
例:
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
char a[110] = "123";
do
{
for(int i =0;i<6;i++)
printf("%c ",a[i]);
printf("\n");
}
while(next_permutation(a,a+3));
return 0;
}
試運転:
一般的に、これらのコンテナを使用すると、コードの量を減らすことができます。多くの使用法と多くの注意事項があります。当面は、この点しか理解していません。この点のみを共有できます。他の点については後で学び、また来ます。経験交換やその他の歓迎のコメント、またはQ me 2905257286