C ++:OOP + STL

学校初日!Evernoteは使いにくいので、ここにメモを移動しましょう〜

OOP

オブジェクト指向<->
IDEのプロセス:統合開発環境(1-2に精通)
STL:標準テンプレートライブラリ
名前空間
識別子の名前付け可能な範囲(演算子名前付け::)
名前の衝突の問題に対する効果的な解決策

void assert( int expression );

アサート機能:式を計算し、エラーが発生した場合にエラーメッセージを出力し、abortを呼び出してプログラム操作を終了します

Mini.cppプログラム分析

// a mini c++ program
#include <iostream>
int main()
{
    
    
    std::cout << "Hello, world!" << std::endl;
    return 0;   // 返回0表示运行成功
}

ヘッダーファイルのサフィックスは.h / .hppまたはサフィックスなし(標準ヘッダーファイル)です。
メイン関数はreturnを書き込まず、デフォルトで0を返します。これは、操作が成功したことを意味します。

ストリーム出力文字<<

バイナリ演算子、左連想、戻り値std :: cout

cout<<"Hello World";
//左操作数cout(类似文件),右操作数字符串,将右输出到左
//返回值 std::cout
cout<<"Hello World"<<endl;
//第一次返回cout,右操作数endl,将右输出到左

ストリング

文字列接続を直接使用できます+

string spaces(n,'char');
cout<<spaces;
//连续输出n个char字符
os<<s;//写入os输出流
is>>s;//读出is输入流
#include<iomanip>
cout<<setprecision(n)<<n;
//setprecision(n):设置输出有效数字
#include<iomanip>
#include<ios>
streamsize prec=cout.precision();
//std::streamsize:标准库内部定义的一个整数类型
//precision()返回当前浮点数精度
equal(a.begin(),a.end(),b.begin());
//提供a的收尾为比较范围,判断ab是否相等
equal(a.begin(),a.end(),b.begin(),b.end());
//要求容器相同,判断a,b是否相同

ベクター

同じタイプ、可変長の複数の値を保存します

vector<类型> 类型名;
vector.push_back(x);
#include<algorithm>
sort(vector.begin(),vector.end());
//默认非降序排序

vector.begin()
コンテナの最初の要素vector.end()コンテナ最後の要素の次の位置

vector.erase(i);
//删除vector中元素
mid=size%2==0?(array[mid]+array[mid])/2:array[mid];
//求中值
vector.insert(ret.loc,const TYPE &val ); 
//在指定位置前加入val,返回指向这个元素的迭代器
vector.insert(ret.loc,int num,const TYPE &val); 
//在指定位置前加入num个val
vector.insert(ret.loc,input_iterator start,input_iterator end); 
//在指定位置前插入区间[start, end)的所有元素

リスト

ベクトルとリストを比較する:リスト

地図

キー値コレクション(pythonのdict)を格納します。各要素はペアであり、最初と2番目の2つの要素が含まれます(it-> first、it-> second)

イテレーター

次の要素に自動的に戻るデザインパターン
、コンテナの内部式を公開せずにコンテナ内の要素に順次アクセスできるスマートポインタ
5つのSTLイテレータ:
入力イテレータ(データを読み取り、イテレーションオブジェクトを下に向ける) 1)

for(istream_iterator<int>i=cin; i!=istream_iterator<int>(); ++i)
       v.push_back(*i);

出力イテレーター(順番に保存されたデータ、書き込みはできますが読み取りはできません、巻き戻しはできません)

int tmp;
while(ifile>>tmp) cout<<tmp;

copy(istream_iterator<int>(ifile), istream_iterator<int>(),ostream_iterator<int>(cout));

フォワードイテレーター(入力+出力)

void replace(FI first,FI last, const T& x,const T& y){
    
    
  for(;first!=last;++first)//输入
    if(*first==x)
			*first=y;//输出

双方向イテレーター(2方向の要素へのアクセス、シングルステップの移動に限定:リスト、セット、マルチセット、マップ、マルチマップ)

template<class BI,class Compare>
void bubble_sort(BI first,BI last, Compare comp){
    
    
	while(first != last){
    
    
		for(BI r = first+1;r!=last;r++){
    
    
			if(comp(*r,*(r-1)))
			{
    
     BI::value_type rv = *r; *r = *(r-1);
			*(r-1) = rv;
		} }
		first++; }
}

ランダムアクセスイテレーター(2方向のアクセス要素、任意の添え字でアクセスできます:vector、deque)

vector<int>::iterator i=v.begin(); 
vector<int>::iterator j=i+2;
      cout<< *j<<"";
	  i+=3; 
	  cout<< *i<<"";

ここに写真の説明を挿入

for(vector<int>::iterator iter(迭代变量名) = a.begin();iter != a.end(); ++iter)
{
    
    
    cout << *iter << endl;
}

各STLコンテナは、2つのイテレータを定義します。

container-type::const_iterator//不可改变容器内值
container-type::iterator

異常な

例外がスローされると、プログラムは例外が発生した場所で停止し、例外オブジェクトを送信します

throw domain_error("median of an empty vector");
//domain_error: 用来说明一个函数的实参是这个函数不能接受的。

トライキャッチ:

try{
    
    
	}catch(异常类型){
    
    }

試行後に関数ステートメントを実行してみてください。例外がある場合はジャンプしてキャッチ内のステートメントを実行し、例外がない場合はキャッチを直接スキップします。

名前のないオブジェクト

cout<<string(maxlen+1-students[i].name.size(),' ');
//变量的名字是spaces(?)

見積もり

同じメモリユニットを指すオブジェクトのエイリアス。
主な目的:関数が参照パラメータを設定できるようにする(パラメータ==実際のパラメータ)

数据类型 & 标识符(左值表达式);
数据类型 & 标识符=左值表达式;

ポインタから異なる:
参照が初期化されなければならない、NULLポインタを指すことができる
の参照マッピングを変更することはできません、あなたはへのポインタポイントを変更することができます
参照、引用されていない(?)のポインタが参照されていない配列を参照していません

const int &s1=s2;
const int &s3=s1;
int &s4=s1;//错误!静态变量必须由静态变量引用
//保证不会改变s1的值

参照パラメーターは左辺値を受け入れる必要があります

関数の戻り値が参照の場合:
関数呼び出しは方程式の左側に表示さ
れ、関数内のローカル変数
への参照返すことはできません。戻るときに一時オブジェクトは生成されません。

関数パラメーターの3つの形式

double fun(int a){
    
    }

実際のパラメータを変更せずに実際のパラメータをコピーする

double fun(int &a){
    
    }

実際のパラメータをコピーせず、実際のパラメータを変更してください

double fun(const int &a){
    
    }

実際のパラメータをコピーしたり、実際のパラメータを変更したりしないでください


過負荷

同じ関数名、異なるパラメータリスト

乱数

コンピュータのランダム数は疑似ランダム数
モンテカルロ法です

srand(unsigned(yime(0)));//使用前要随机化,否则产生的序列是相同的
int i=rand(1000);

検索-if

アレイとSTLコンテナを検索する

#include <algorithm>

list<int>::iterator it = find(lst.begin(), lst.end(), 10); 
// 查找list中是否有元素10
// find函数没有找到对应值,返回第二个参数
list<CPerson*>::iterator it = find_if(lst.begin(),lst.end(), func);
// 自行定义查找,func为谓词,返回第一个让func返回true的值
isspace(char c) //库函数,检查所传的字符是否是空白字符

isspaceはオーバーロードされた関数(複数のデータタイプをサポート)であり、述語として使用することはできず、再パッケージ化する必要があります

一般的な機能

使用前のパラメータタイプと戻り値タイプ(find関数など)がわかりません。
一般的な形式:最初の2つのパラメータは、アルゴリズム操作の範囲を表すイテレータのペアです[最初、最後)。
関数の一般化:パラメータデータタイプの抽象化+操作オブジェクトの表現と動作の抽象化

一般的なアルゴリズム

それに作用するイテレータの代わりにコンテナ。
主:定数値アルゴリズム、変数値アルゴリズム、ソートアルゴリズム、数値アルゴリズム
ベクトルと両端キュー支持ランダムイテレータ、
リスト、マップ、セット、マルチマップ及び双方向イテレータをサポートするマルチセット。
イテレータ支援方法。 begin()/ end()およびrbegin()/ rend();


最初の週のクラスディスカッション

新入生のクラスメートは本当に活発すぎます...たくさんの質問をしました...(・-・*)

endl
endlはストリーム演算子です。バッファ領域は出力と同時にクリアされます(コールフラッシュも可能です)。
プログラムが正常に終了すると、バッファ領域は自動的にクリアされます。

おすすめ

転載: blog.csdn.net/Rachel_IS/article/details/104473642