STLコンテナクラス

STL

1. STL の最初の紹介

1.1 イテレータ

1.1.1 ネイティブ ポインタはイテレータでもあります

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
void test01() {
	int arr[5] = { 1,2,3,4,5 };
	int* p = arr;
	for (int i = 0; i < 5; i++) {
		cout << arr[i] << endl;
		cout << *(p+i) << endl;
	}
};
int main() {
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501182726266

1.1.2 ループの反復

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void print(int i) {
    
    

	cout <<i << endl;
}
void test02() {
    
    
	vector<int >v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	vector<int>::iterator itbegin = v.begin();
	vector<int>::iterator itend = v.end();
	while (itbegin != itend) {
    
    
		cout << *itbegin << endl;
		itbegin++;
	}
	for (vector<int>::iterator i = itbegin; i!=v.end();i++) {
    
    
		cout << *i << endl;
	}
	for_each(v.begin(), v.end(), print);
}


int main() {
    
    
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501192746580

1.1.3 カスタムデータ構造

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Person {
public:
	Person(string name,int age) {
		this->name = name;
		this->age = age;
	}
	string name;
	int age;
};
void test03() {
	vector<Person> v;
	Person p1("aaa", 10);
	Person p2("bbb", 20);
	Person p3("ccc", 30);
	Person p4("ddd", 40);
	Person p5("eee", 50);
	Person p6("fff", 60);
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
	v.push_back(p5);
	v.push_back(p6);
	for (vector<Person>::iterator it = v.begin(); it!=v.end(); it++) {
		cout << (*it).name<< endl;
	}
}
int main() {
	test03();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501195143536

1.2 文字列コンテナ

1.2.1 文字列の初期化

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
void test01() {
	string str;// 初始化对象
	string str2(str); // 用另外一个对象初始化
	string str3 = "abc"; // 把值赋值给当前字符串
	string str4(10, 'q'); // 用n个字符赋值给当前字符串
	cout << "str3= " << str3 << endl;
	cout << "str4= " << str4 << endl;
}

int main() {
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501201634698

1.2.2 文字列の割り当て

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
void test02() {
	string str;
	str = "abc";

	str.assign("abcde", 3);
	cout << str << endl;

	string str2;
	str2.assign(str); //字符串赋值
	cout << str2 << endl;
	str2.assign(str, 0, 2); // 将s从start开始n个字符赋值给字符串
	cout << str2 << endl;

}

int main() {
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501201942683

1.2.3 値のチェック

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
void test03() {
	string str="hello world!";
	for (int i = 0; i < str.size(); i++) {
		cout << str[i] << endl;
	}
	// [] 和at 区别,[] 访问越界直接挂掉,at访问越界,抛出out_of_range 异常
	try {
		cout << str.at(100) << endl;
	}
	catch (out_of_range& e) {
		cout << e.what() << endl;
	}
	catch (...) {
		cout << "异常捕获"<<endl;
	}

}

int main() {
	test03();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501203038084

1.2.4 追加、削除、変更、確認

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
void test04() {
	// 字符串拼接
	string  str1 = "我";
	string str2 = "爱天安门";
	cout <<"1:" << str1 + str2 << endl;
	cout <<"2:" << str1.append(str2) << endl;

	string str = "abcdefgde";
	int pos = str.find("de");

	if (pos == -1) {
		cout << "未找到字符串" << endl;
	}
	else
	{
		cout << "找到了字符串,位置为:" << pos << endl;
	}
	str.replace(1, 3, "11111");// 替换从pos开始n个字符的字符串为str
	cout << str << endl;
}

int main() {
	test04();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501204621438

1.2.5 文字列の比較

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
void test05() {
	string str1 = "abcde";
	string str2 = "abcdef";
	if (str1.compare(str2) == 0) {
		cout << "str1==str2" << endl;
	}
	else if (str1.compare(str2) > 0) {
		cout << "str1>str2" << endl;
	}
	else
	{
		cout << "str1<str2" << endl;

	}
}

int main() {
	test05();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501205006747

1.2.6 文字列インデックス

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
void test06() {
	string email = "[email protected]";
	int pos = email.find("@");
	// [start:end]
	string userName = email.substr(0, pos);
	cout << userName << endl;
}

int main() {
	test06();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501205256320

1.2.7 文字列の解析

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
void test07() {
	string str = "www.baidu.com";
	vector<string> v;
	int start = 0;
	int pos = -1;
	while (true) {
		pos = str.find(".", start);
		if (pos == -1) {
			string tempStr = str.substr(start, str.size() - start);
			v.push_back(tempStr);
			break;
		}
		string tempStr = str.substr(start, pos - start);
		v.push_back(tempStr);
		start = pos + 1;
	}
	for (vector<string>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << endl;
	}
		
}

int main() {
	test07();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501213945866

1.2.8 挿入と削除

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
void test08() {
	string str = "hello";
	str.insert(1, "111");

	cout << str << endl;

	str.erase(1, 3);// 从pos开始的n个字符
	cout << str << endl;

}

int main() {
	test08();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501214139969

1.2.9 文字と文​​字列間の変換

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
void test09() {
	const char* str = "abcd";
	// 转str
	string s(str);

	//str 转const
	const char* str2 = s.c_str();
	// const char* 可以隐式转换string,反之不可

}
int main() {
	test09();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501214428988

1.2.10 文字列変換

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
void test10() {
	string s = "abcdefg";
	char& a = s[2];
	char& b = s[3];

	a = '1';
	b = '2';
	cout << s << endl;
	cout << (int*)s.c_str() <<endl;
	s = "ppppppppppppppp";

	cout << s << endl;
	cout << (int*)s.c_str() << endl;


}
int main() {
	test10();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501214651331

1.3. vector容器

1.3.1 容量

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
void test01() {
	vector<int> v;
	for (int i = 0; i < 10; i++){
		v.push_back(i);
		cout << v.capacity() << endl;  // v.capacity()容器的容量
	}
}

int main() {
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501225522551

1.3.2 割り当て

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;

void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test02() {
	vector<int>v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);
	//vector& operator=(const vector & vec);//重载等号操作符
	//assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
	//assign(n, elem);//将n个elem拷贝赋值给本身。
	//vector& operator=(const vector & vec);//重载等号操作符
	vector<int>v2(v1.begin(), v1.end());
	printVector(v2);
	vector<int>v3;
	v3.assign(v1.begin(), v1.end());
	printVector(v3);
	vector<int>v4(10, 100);
	printVector(v4);
	cout << "v3和v4互换后:" << endl;
	v3.swap(v4);
	printVector(v3);
	printVector(v4);
}

int main() {
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501230444646

1.3.3 状態判定と動作

  • size();//コンテナ内の要素の数を返します
  • empty(); // コンテナが空かどうかを判定する
  • size(int num);//コンテナの長さを num として再指定し、コンテナが長くなった場合は、新しい位置をデフォルト値で埋めます。コンテナーが短くなると、コンテナーの長さを超える最後の要素が削除されます。
  • size(int num, elem);//コンテナの長さを num として再指定し、コンテナが長くなった場合は、新しい位置を elem の値で埋めます。コンテナーが短くなると、コンテナーの長さ > 度を超える端の要素が削除されます。
  • Capacity();//コンテナの容量
  • reserve(int len);//コンテナは len 個の長さの要素を予約しますが、予約された位置は初期化されておらず、要素にはアクセスできません。
  • at(int idx); //インデックス idx が指すデータを返します。idx が範囲外の場合、out_of_range 例外がスローされます。
  • Operator[];//インデックス idx が指すデータを返します。範囲外の場合は、操作中にエラーが直接報告されます。
  • front();//コンテナ内の最初のデータ要素を返す
  • back();//コンテナ内の最後のデータ要素を返します
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test03()
{
	vector<int>v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(50);

	if (v1.empty())
	{
		cout << "v1为空" << endl;
	}
	else
	{
		cout << "v1不为空 ,大小为: " << v1.size() << endl;
	}

	v1.resize(10, 100); //第二个参数代表默认填充值

	printVector(v1);

	v1.resize(3);

	printVector(v1);

	cout << "v1的front = " << v1.front() << endl;
	cout << "v1的back  = " << v1.back() << endl;

}

int main() {
	test03();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501231011665

1.3.4 挿入と削除

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
void printVector(vector<int>& v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}
void test04()
{
	vector<int>v;
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);

	v.insert(v.begin(), 100);

	printVector(v);

	v.push_back(1000);

	printVector(v);

	v.pop_back();

	printVector(v);


	v.erase(v.begin());
	printVector(v);

	//v.erase(v.begin(), v.end()); 等价于  v.clear();
	v.clear();
	//v.erase(v.begin(), v.end());
	printVector(v);

}



int main() {
	test04();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230501231145772

1.4と

1.4.1 コンストラクター

  • deque deqT; //デフォルトの構築形式
  • deque(beg, end);//コンストラクターは、[beg, end) 範囲内の要素をそれ自体にコピーします。
  • deque(n, elem);//コンストラクターは n 個の要素をそれ自体にコピーします。
  • deque(const deque &deq);//コンストラクターをコピーします。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<deque>
#include<algorithm>
#include<string>
using namespace std;
void printDeque(const deque<int>& d)
{
	//iterator普通迭代器
	//reverse_iterator 反转迭代器
	//const_iterator  只读迭代器

	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		//*it = 1000;
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	deque<int>d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_back(40);
	deque<int>d2;
	d2 = d;
	printDeque(d2);

	if (d2.empty())
	{
		cout << "d2为空" << endl;
	}
	else
	{
		cout << "d2不为空 size = " << d2.size() << endl;
	}
}
void test02() {
	deque<int>d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_back(100);
	d.push_back(200);
	d.push_back(300);
	printDeque(d);
	d.pop_back(); // 尾删
	d.pop_front(); // 头删
	printDeque(d);
	cout << "第一个元素为:" << d.front() << endl;
	cout << "最后一个元素为:" << d.back() << endl;
	
}
int main() {
	test01();
	test02();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230502103418754

1.4.2 代入操作

  • assign(beg, end);//[beg, end) 区間のデータをコピーしてそれ自体に割り当てます。
  • assign(n, elem);//n 個の elem のコピーをそれ自体に割り当てます。
  • deque& 演算子=(const deque &deq); //等号演算子のオーバーロード
  • swap(deq);// deq を独自の要素と交換します
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<deque>
#include<algorithm>
#include<string>
using namespace std;
void printDeque(const deque<int>& d)
{
	//iterator普通迭代器
	//reverse_iterator 反转迭代器
	//const_iterator  只读迭代器

	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		//*it = 1000;
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	deque<int>d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_back(40);
	deque<int>d2;
	d2 = d;
	printDeque(d2);

	if (d2.empty())
	{
		cout << "d2为空" << endl;
	}
	else
	{
		cout << "d2不为空 size = " << d2.size() << endl;
	}
}
void test02() {
	deque<int>d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_back(100);
	d.push_back(200);
	d.push_back(300);
	printDeque(d);
	d.pop_back(); // 尾删
	d.pop_front(); // 头删
	printDeque(d);
	cout << "第一个元素为:" << d.front() << endl;
	cout << "最后一个元素为:" << d.back() << endl;
	
}
void test03(){
	deque<int>d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_back(100);
	d.push_back(200);
	d.push_back(300);
	d.insert(++d.begin(), 2, 1000);
	printDeque(d);
	d.erase(++d.begin());
	d.erase(++d.begin());
	deque<int>::iterator it1 = d.begin();
	it1 = it1 + 1;
	deque<int>::iterator it2 = d.begin();
	it2 = it2 + 3;
	d.erase(it1, it2);
	printDeque(d);
	d.clear();
	printDeque(d);
}
bool myComare(int v1, int v2) {
	return v1 < v2;
}
int main() {
	// test01();
	// test02();
	test03();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230502103936561

1.4.3 サイズ操作

  • deque.size();//コンテナ内の要素の数を返す
  • deque.empty();//コンテナが空かどうかを判定する
  • deque.resize(num);//コンテナの長さを num に再指定します。コンテナが長くなった場合は、新しい位置をデフォルト値で埋めます。コンテナーが短くなると、コンテナーの長さを超える端の要素が削除されます。
  • deque.resize(num, elem); // コンテナの長さを num に再指定します コンテナが長くなった場合、新しい位置は elem の値で埋められます コンテナが短くなった場合、それを超えた最後の要素はコンテナの長さが削除されます。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<deque>
#include<algorithm>
#include<string>
using namespace std;
void printDeque(const deque<int>& d)
{
	//iterator普通迭代器
	//reverse_iterator 反转迭代器
	//const_iterator  只读迭代器

	for (deque<int>::const_iterator it = d.begin(); it != d.end(); it++)
	{
		//*it = 1000;
		cout << *it << " ";
	}
	cout << endl;
}
void test01()
{
	deque<int>d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_back(40);
	deque<int>d2;
	d2 = d;
	printDeque(d2);

	if (d2.empty())
	{
		cout << "d2为空" << endl;
	}
	else
	{
		cout << "d2不为空 size = " << d2.size() << endl;
	}
}
void test02() {
	deque<int>d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_back(100);
	d.push_back(200);
	d.push_back(300);
	printDeque(d);
	d.pop_back(); // 尾删
	d.pop_front(); // 头删
	printDeque(d);
	cout << "第一个元素为:" << d.front() << endl;
	cout << "最后一个元素为:" << d.back() << endl;
	
}
void test03(){
	deque<int>d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_back(100);
	d.push_back(200);
	d.push_back(300);
	d.insert(++d.begin(), 2, 1000);
	printDeque(d);
	d.erase(++d.begin());
	d.erase(++d.begin());
	deque<int>::iterator it1 = d.begin();
	it1 = it1 + 1;
	deque<int>::iterator it2 = d.begin();
	it2 = it2 + 3;
	d.erase(it1, it2);
	printDeque(d);
	d.clear();
	printDeque(d);
}
bool myComare(int v1, int v2) {
	return v1 < v2;
}
void test04() {
	deque<int>d;
	d.push_back(10);
	d.push_back(20);
	d.push_back(30);
	d.push_front(100);
	d.push_front(200);
	d.push_front(300);
	// 默认排序从小到大
	//sort(d.begin(), d.end());
	sort(d.begin(), d.end(), myComare);
	printDeque(d);
}
int main() {
	// test01();
	// test02();
	// test03();
	test04();
	system("pause");
	return EXIT_SUCCESS;
}

画像-20230502104600016

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<deque>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
class Player
{
public:
	Player(string name, int score) {
		this->m_Name = name;
		this->m_Score = score;
	};
	string m_Name; // 姓名
	int m_Score; // 平均分
};
void createPlayer(vector<Player>& v) {
	string nameSeed = "ABCDE";
	for (int i = 0; i < 5; i++) {
		string name = "选手";
		name += nameSeed[i];
		int score = 0;
		Player player(name, score);
		v.push_back(player);
	}
};
void setScore(vector<Player>& v) {
	for (vector<Player>::iterator it = v.begin(); it != v.end(); it++) {
		deque<int> d;
		for (int i = 0; i < 10; i++) {
			int score = rand() % 41 + 60;
			d.push_back(score);
		}
		sort(d.begin(), d.end());
		
		d.pop_back();
		d.pop_front();

		int sum = 0;
		for (deque<int>::iterator dit = d.begin(); dit != d.end(); dit++) {
			sum += *dit;
		}
		int avg = sum / d.size();
		it->m_Score = avg;
	}
}
void showScore(vector<Player>&v){
	for (vector<Player>::iterator it = v.begin(); it != v.end(); it++) {
		cout << "姓名:" << (*it).m_Name << "平均分数:" << it->m_Score << endl;
	}

}
int main() {
	srand((unsigned int)time(NULL));
	vector<Player> v;
	createPlayer(v);

	setScore(v);

	showScore(v);
	
	

	system("pause");
	return EXIT_SUCCESS;
}

画像-20230502112016665

1.5 スタックコンテナ

  • stack&operator=(const stack &stk);//等号演算子のオーバーロード
  • Push(elem);//スタックの先頭に要素を追加します
  • Pop();//スタックの先頭から最初の要素を削除します
  • top();//スタックの最上位要素を返す
  • empty(); // スタックが空かどうかを判断します
  • size();//スタックのサイズを返す
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include <stack>

void test01()
{
	stack<int>S;
	//入栈
	S.push(10);
	S.push(20);
	S.push(30);
	S.push(40);

	cout << "size  = " << S.size() << endl;

	while (!S.empty())
	{
		//访问栈顶元素
		cout << S.top() << endl;
		//出栈
		S.pop();
	}
	cout << "size  = " << S.size() << endl;

}


int main() {

	test01();

	system("pause");
	return EXIT_SUCCESS;
}

画像-20230502112311130

1.6 キューキュー

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include <queue>
#include <string>
class Person
{
public:
	Person(string name, int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}
	string m_Name;
	int m_Age;
};

void test01()
{
	queue<Person> Q; //队列容器

	Person p1("aaa", 10);
	Person p2("bbb", 20);
	Person p3("ccc", 30);
	Person p4("ddd", 40);


	//入队
	Q.push(p1);
	Q.push(p2);
	Q.push(p3);
	Q.push(p4);

	cout << "size = " << Q.size() << endl;

	while ( !Q.empty())
	{
		cout << "队头元素--- 姓名:  " << Q.front().m_Name << " 年龄: " << Q.front().m_Age << endl;
		cout << "队尾元素--- 姓名:  " << Q.back().m_Name << " 年龄: " << Q.back().m_Age << endl;

		//出队
		Q.pop();
	}

	cout << "size = " << Q.size() << endl;

}

int main(){

	test01();

	system("pause");
	return EXIT_SUCCESS;
}

画像-20230502112530044

1.7 リストコンテナ

1.7.1 コンストラクター

  • list lstT;//リストはテンプレート クラスを使用して実装され、オブジェクトのデフォルトの構造は次のとおりです。
  • list(beg, end);//コンストラクターは区間 [beg, end) 内の要素をそれ自体にコピーします。
  • list(n,elem);//コンストラクターは n 個の要素をそれ自体にコピーします。
  • list(const list &lst);//コンストラクターをコピーします。
  • Push_back(elem);//コンテナの最後に要素を追加します Pop_back();//コンテナ内の最後の要素を削除します
  • Push_front(elem);//コンテナの先頭に要素を挿入します
  • Pop_front();//コンテナの先頭から最初の要素を削除します
  • insert(pos,elem);//elem 要素のコピーを pos 位置に挿入し、新しいデータの位置を返します。
  • insert(pos,n,elem);//位置 pos に n 個の elem データを挿入します。戻り値はありません。
  • insert(pos,beg,end);// [beg,end) 間隔の pos 位置にデータを挿入します。戻り値はありません。
  • clear();//コンテナからすべてのデータを削除します
  • Erase(beg,end);//[beg,end)区間のデータを削除し、次のデータの位置を返します。
  • Erase(pos);//pos 位置のデータを削除し、次のデータの位置を返します。
  • Remove(elem);//elem 値に一致するコンテナ内のすべての要素を削除します。
list<T> lstT;//list采用采用模板类实现,对象的默认构造形式:
list(beg,end);//构造函数将[beg, end)区间中的元素拷贝给本身。
list(n,elem);//构造函数将n个elem拷贝给本身。
list(const list &lst);//拷贝构造函数。

1.7.2 データ要素の挿入および削除操作

push_back(elem);//在容器尾部加入一个元素
pop_back();//删除容器中最后一个元素
push_front(elem);//在容器开头插入一个元素
pop_front();//从容器开头移除第一个元素
insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);//删除pos位置的数据,返回下一个数据的位置。
remove(elem);//删除容器中所有与elem值匹配的元素。

1.7.3 リストサイズの操作

size();//返回容器中元素的个数
empty();//判断容器是否为空
resize(num);//重新指定容器的长度为num,
若容器变长,则以默认值填充新位置。
如果容器变短,则末尾超出容器长度的元素被删除。
resize(num, elem);//重新指定容器的长度为num,
若容器变长,则以elem值填充新位置。
如果容器变短,则末尾超出容器长度的元素被删除。

1.7.4 リストデータへのアクセス

front();//返回第一个元素。
back();//返回最后一个元素。

1.7.5 リストの逆ソート

reverse();//反转链表,比如lst包含1,3,5元素,运行此方法后,lst就包含5,3,1元素。
sort(); //list排序

1.8セット/マルチセット

  • セットの特徴は、すべての要素は、要素のキー値に従って自動的に並べ替えられます。マップとは異なり、Set の要素は実数値とキー値の両方を同時に持つことができ、セットの要素はキー値と実数値の両方です。Set では、2 つの要素が同じキー値を持つことはできません。
  • multiset の特性と使用法は set とまったく同じですが、唯一の違いはキー値の重複が許可されることです。set と multiset の基礎となる実装は、バランスのとれたバイナリ ツリーの一種である赤黒ツリーです。

1.8.1 コンストラクター

set<T> st;//set默认构造函数:
mulitset<T> mst; //multiset默认构造函数: 
set(const set &st);//拷贝构造函数

1.8.2 代入操作

set& operator=(const set &st);//重载等号操作符
swap(st);//交换两个集合容器

1.8.3 サイズ設定操作

size();//返回容器中元素的数目
empty();//判断容器是否为空

1.8.4 挿入および削除操作

insert(elem);//在容器中插入元素。
clear();//清除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem);//删除容器中值为elem的元素。

1.8.5 検索操作

find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key);//查找键key的元素个数
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。

1.9 マップ/マルチマップコンテナ

1.9.1 マップ/マルチマップの基本概念

Map の特徴は、要素のキー値に応じてすべての要素が自動的にソートされることです。Map のすべての要素は、実数値とキー値の両方を持つペアです。ペアの最初の要素はキー値とみなされ、2 番目の要素は実数値とみなされます。Map では、2 つの要素が実数値を持つことはできません。同じキー値。

マップのキー値はマップ要素の配置規則に関係しており、マップのキー値を変更するとマップの構成に重大な損害を与えます。要素の実際の値を変更したい場合は、変更できます。

マップとリストには同じプロパティがいくつかあります。そのコンテナ要素を追加または削除するとき、操作前のすべてのイテレータは、操作が完了した後も引き続き有効です。もちろん、削除された要素のイテレータは例外でなければなりません。

Multimap と map の操作は似ていますが、唯一の違いは、multimap のキー値を繰り返すことができることです。

Map と multimap は両方とも、基盤となる実装メカニズムとして赤黒ツリーを使用します。

1.9.2 コンストラクター

map<T1, T2> mapTT;//map默认构造函数: 
map(const map &mp);//拷贝构造函数

1.9.3 割り当て

map& operator=(const map &mp);//重载等号操作符
swap(mp);//交换两个集合容器

1.9.4 マップサイズの操作

size();//返回容器中元素的数目
empty();//判断容器是否为空

1.9.5 要素の挿入操作

map.insert(...); //往容器插入元素,返回pair<iterator,bool>
map<int, string> mapStu;
// 第一种 通过pair的方式插入对象
mapStu.insert(pair<int, string>(3, "小张"));
// 第二种 通过pair的方式插入对象
mapStu.inset(make_pair(-1, "校长"));
// 第三种 通过value_type的方式插入对象
mapStu.insert(map<int, string>::value_type(1, "小李"));
// 第四种 通过数组的方式插入值
mapStu[3] = "小刘";
mapStu[5] = "小王";

1.9.6 マップ削除操作

clear();//删除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg,end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(keyElem);//删除容器中key为keyElem的对组。

1.9.7 地図検索操作

find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end();
count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。

おすすめ

転載: blog.csdn.net/weixin_42917352/article/details/130468454