C++分析——容器STL


C++使用容器可以極大的方便對數據的操作,將數據排布儲存,然後使用的時候再調用。
容器測試的結構體

typedef struct
{
		char 	name[50];
		int	number;
}CAPP_info;

#容器通用函數
在不同的容器中,這些函數是通用的,以vector容器爲例。
std::vector Test_STL_info;

##判斷容器是否爲空:Test_STL_info .empty()
返回值:若容器爲空,返回1,非空返回0。

##計算容器個數:Test_STL_info .size()
返回值:返回容器內容的實際個數,若爲空,返回0。

結合判斷容器是否爲空,測試代碼

	cout << "vertor int number is " << m_vertor_int_info.size() << endl;
	cout << "vertor int empty is " << m_vertor_int_info.empty() << endl;
	
	for(int i = 0;i < 10;i++)
	{
		m_vertor_int_info.push_back(i);
	}

	cout << "vertor int number is " << m_vertor_int_info.size() << endl;
	cout << "vertor int empty is " << m_vertor_int_info.empty() << endl;

執行結果:

$ ./project.o 
vertor int number is 0
vertor int empty is 1
vertor int number is 10
vertor int empty is 0

##清空容器內容:Test_STL_info .clear()
該函數會將容器的內容清空。

##獲得容器的首尾內容:Test_STL_info .begin()、Test_STL_info .end()
Test_STL_info .begin():函數返回的是容器第一個的內容。
Test_STL_info .end():函數返回容器的尾部,不是最後一個的內容,迭代器的上一個纔是容器最後一個的內容。

源碼

void Module_vector::Show_info(std::vector<int> &info)
{
std::vector<int>::iterator iter = info.begin();

	while(iter != info.end())
	{
		cout << "int vertor info is "<< *iter << endl;
		iter++;
	}

	iter = info.begin();
	cout << "int vertor begin info is "<< *iter << endl;

	iter = info.end();
	cout << "int vertor end info is "<< *iter << endl;

	iter = info.end();
	cout << "int vertor end-1 info is "<< *(iter-1) << endl;
}

執行結果

int vertor info is 10
int vertor info is 15
int vertor info is 20
int vertor info is 25
int vertor info is 30
int vertor info is 35
int vertor info is 40
int vertor info is 45
int vertor info is 50
int vertor info is 55
int vertor begin info is 10
int vertor end info is 0
int vertor end-1 info is 55

#vector容器
頭文件:#include
容器定義:std::vector vertor_info;

其中int爲容器裏面所存儲的類型,可以是指針和結構體。

##vector容器測試定義類:Module_vector

class Module_vector : public CPP_Public
{
public:
	Module_vector();
	~Module_vector();
	void Init();
	void Module_Func_Run();

private:
	void Show_info(std::vector<int> &info);
	void Show_info(std::vector<std::string> &info);
	void Show_info(std::vector<CAPP_info> &info);

private:
	std::vector<int> 			m_vertor_int_info;
	std::vector<std::string> 	m_vertor_string_info;
	std::vector<CAPP_info> 	m_vertor_struct_info;

};

##vector測試類的構造和析構函數

Module_vector::Module_vector():
{
		m_vertor_int_info.clear();
		m_vertor_string_info.clear();
		m_vertor_struct_info.clear();
}

Module_vector::~Module_vector()
{
		m_vertor_int_info.clear();
		m_vertor_string_info.clear();
		m_vertor_struct_info.clear();
}

vector測試類的初始化

分別對數字型、字符串型和數組型進行初始化。

1、使用push_back函數對vector容器內容進行填充,此處分別填充int,string和結構體類型。

void Module_vector::Init()
{
	for(int i = 0;i < 10;i++)
	{
		m_vertor_int_info.push_back(i*5);
	}

	m_vertor_string_info.push_back(string("Test vector 1"));
	m_vertor_string_info.push_back(string("Test vector 2"));
	m_vertor_string_info.push_back(string("Test vector 3"));

	CAPP_info Inptut_info;
	memset((void *)&Inptut_info,0,sizeof(CAPP_info));

	sprintf(Inptut_info.name,"%s","vector struct test 1");
	Inptut_info.number = 23;
	m_vertor_struct_info.push_back(Inptut_info);

	sprintf(Inptut_info.name,"%s","vector struct test 2");
	Inptut_info.number = 34;
	m_vertor_struct_info.push_back(Inptut_info);

}

2、複製其他容器進行初始化

	std::vector<int> Value;
	Value.push_back(1);
	Value.push_back(3);
	Value.push_back(4);
	Value.push_back(6);

	std::vector<int> TestValue = Value;

3、截取其他容器的一段來初始化

	std::vector<int> Value;
	Value.push_back(1);
	Value.push_back(3);
	Value.push_back(4);
	Value.push_back(6);

	std::vector<int> TestValue;
	TestValue.insert(TestValue.begin(),Value.begin()+1,Value.begin()+3);

vector測試類內容的顯示,取出vector內容

取出vector容器裏面的內容,可以使用下標訪問法,也可以使用迭代器去訪問。
宏定義:#defien LEN_NUM 1 //使用容器下標訪問

源碼:源碼對容器內容顯示使用的C++函數重載的方法。

void Module_vector::Show_info(std::vector<int> &info)
{
#if LEN_NUM==1
	for(int i = 0;i < (int)info.size();i++)
	{
		cout << "LEN_NUM int vertor info is "<< info[i] << endl;
	}

#else
	std::vector<int>::iterator iter = info.begin();		//定義迭代器

	while(iter != info.end())
	{
		cout << "int vertor info is "<< *iter << endl;
		iter++;
	}
#endif
}

void Module_vector::Show_info(std::vector<std::string> &info)
{
#if LEN_NUM==1
	for(int i = 0;i < (int)info.size();i++)
	{
		cout << "LEN_NUM string vertor info is "<< info[i] << endl;
	}

#else

	std::vector<std::string>::iterator iter = info.begin();		//定義迭代器


	while(iter != info.end())
	{
		cout << "int string vertor info is "<< *iter << endl;
		iter++;
	}
#endif	
}

void Module_vector::Show_info(std::vector<CAPP_info> &info)
{
#if LEN_NUM==1
	for(int i = 0;i < (int)info.size();i++)
	{
		cout << "LEN_NUM struct vertor info is "<< info[i].name;
		cout << " number is "<< info[i].number << endl;
	}

#else
	std::vector<CAPP_info>::iterator iter = info.begin();	//定義迭代器

	while(iter != info.end())
	{
		cout << "struct vertor info is "<< iter->name;
		cout << " number is "<< iter->number << endl;
		iter++;
	}
#endif
}

運行代碼

void Module_vector::Module_Func_Run()
{
	Show_info(m_vertor_int_info);
	Show_info(m_vertor_string_info);
	Show_info(m_vertor_struct_info);
}

執行結果:
1、 使用下標訪問容器

$ ./project.o 
LEN_NUM int vertor info is 0
LEN_NUM int vertor info is 5
LEN_NUM int vertor info is 10
LEN_NUM int vertor info is 15
LEN_NUM int vertor info is 20
LEN_NUM int vertor info is 25
LEN_NUM int vertor info is 30
LEN_NUM int vertor info is 35
LEN_NUM int vertor info is 40
LEN_NUM int vertor info is 45
LEN_NUM string vertor info is Test vector 1
LEN_NUM string vertor info is Test vector 2
LEN_NUM string vertor info is Test vector 3
LEN_NUM struct vertor info is vector struct test 1 number is 23
LEN_NUM struct vertor info is vector struct test 2 number is 34

2、 使用迭代器訪問容器

$ ./project.o 
int vertor info is 0
int vertor info is 5
int vertor info is 10
int vertor info is 15
int vertor info is 20
int vertor info is 25
int vertor info is 30
int vertor info is 35
int vertor info is 40
int vertor info is 45
int string vertor info is Test vector 1
int string vertor info is Test vector 2
int string vertor info is Test vector 3
struct vertor info is vector struct test 1 number is 23
struct vertor info is vector struct test 2 number is 34

#list容器

list容器測試定義類:Module_list

頭文件:#include

容器定義:std::vector vertor_info;

其中int爲容器裏面所存儲的類型,可以是指針和結構體。

class Module_list : public CPP_Public
{
public:
	Module_list();
	~Module_list();
	void Init();
	void Module_Func_Run();
	void AddAndDelete();

private:
	void Show_info(std::list<int> &info);
	void Show_info(std::list<std::string> &info);
	void Show_info(std::list<CAPP_info> &info);
	int Find_info(const int info);
	int Find_info(const std::string &info);
	int Find_info(CAPP_info &info);
	

private:
	std::list<int> 			m_list_int_info;
	std::list<std::string> 		m_list_string_info;
	std::list<CAPP_info> 		m_list_struct_info;
};

list測試類的構造和析構函數

在這個類中的構造和析構裏面主要是爲容器清零。

Module_list::Module_list()
{
	m_list_int_info.clear();
	m_list_string_info.clear();
	m_list_struct_info.clear();
}

Module_list::~Module_list()
{
	m_list_int_info.clear();
	m_list_string_info.clear();
	m_list_struct_info.clear();
}

##list測試類的初始化
分別對數字型、字符串型和數組型進行初始化。
使用push_back函數對vector容器內容進行填充。

void Module_list::Init()
{
	for(int i = 0;i < 10;i++)
	{
		m_list_int_info.push_back((i+3)*8);
	}

	m_list_string_info.push_back(string("Test list 1"));
	m_list_string_info.push_back(string("Test list 2"));
	m_list_string_info.push_back(string("Test list 3"));

	CAPP_info Inptut_info;
	memset((void *)&Inptut_info,0,sizeof(CAPP_info));

	for(int i = 0;i < 4;i++)
	{
		sprintf(Inptut_info.name,"list struct test %d",i);
		Inptut_info.number = i+3;
		m_list_struct_info.push_back(Inptut_info);
	}
}

list測試類內容的顯示,取出list內容

取出list容器裏面的內容,可以使用下標訪問法,也可以使用迭代器去訪問。以後只使用迭代器訪問。

源碼:

void Module_list::Show_info(std::list<int> &info)
{
	std::list<int>::iterator iter = info.begin();

	while(iter != info.end())
	{
		cout << "int vertor info is "<< *iter << endl;
		iter++;
	}
}

void Module_list::Show_info(std::list<std::string> &info)
{
	std::list<std::string>::iterator iter = info.begin();

	while(iter != info.end())
	{
		cout << "int vertor info is "<< *iter << endl;
		iter++;
	}
}

void Module_list::Show_info(std::list<CAPP_info> &info)
{
	std::list<CAPP_info>::iterator iter = info.begin();

	while(iter != info.end())
	{
		cout << "int vertor info is "<< iter->name;
		cout << " number is "<< iter->number << endl;
		iter++;
	}
}

運行代碼:

void Module_list::Module_Func_Run()
{
	Show_info(m_list_int_info);
	Show_info(m_list_string_info);
	Show_info(m_list_struct_info);
}

執行結果:

$ ./project.o
int vertor info is 24
int vertor info is 32
int vertor info is 40
int vertor info is 48
int vertor info is 56
int vertor info is 64
int vertor info is 72
int vertor info is 80
int vertor info is 88
int vertor info is 96
int vertor info is Test list 1
int vertor info is Test list 2
int vertor info is Test list 3
int vertor info is list struct test 0 number is 3
int vertor info is list struct test 1 number is 4
int vertor info is list struct test 2 number is 5
int vertor info is list struct test 3 number is 6

搜索list容器內容

該方法也可以使用在vector容器上

源碼:

int Module_list::Find_info(const int info)
{
	std::list<int>::iterator iter = m_list_int_info.begin();

	while(iter != m_list_int_info.end())
	{
		if(info == *iter)
		{
			cout << "Find the int info is " << info <<endl;
			return TYPE_YES;
		}
		iter++;
	}

	cout << "Not find the int info." <<endl;
	return TYPE_NO;
}

int Module_list::Find_info(const std::string &info)
{
	std::list<std::string>::iterator iter = m_list_string_info.begin();

	while(iter != m_list_string_info.end())
	{
		if(info == *iter)
		{
			cout << "Find the string info is " << info <<endl;
			return TYPE_YES;
		}
		iter++;
	}

	cout << "Not find the string info." <<endl;
	return TYPE_NO;
}

int Module_list::Find_info(CAPP_info &info)
{
	std::list<CAPP_info>::iterator iter = m_list_struct_info.begin();

	while(iter != m_list_struct_info.end())
	{
		if(!strcmp(info.name,iter->name))
		{
			cout << "Find the struct info name is " << iter->name << endl;
			cout << "the struct info  number is " << iter->number << endl;
			return TYPE_YES;
		}
		iter++;
	}

	cout << "Not find the struct info." <<endl;
	return TYPE_NO;
}

運行代碼:

void Module_list::Module_Func_Run()
{
(void)Find_info((4+3)*8);
	(void)Find_info(45);

	(void)Find_info(string("Test list 1"));
	(void)Find_info(string("Test list 1 and 2"));

	CAPP_info Test = {0};

	sprintf(Test.name,"list struct test 2");
	Test.number = 23;
	(void)Find_info(Test);

	sprintf(Test.name,"list struct test 34");
	Test.number = 57;
	(void)Find_info(Test);
}

執行結果

Find the int info is 56
Not find the int info.
Find the string info is Test list 1
Not find the string info.
Find the struct info name is list struct test 2
the struct info  number is 5
Not find the struct info.

#map容器
##map容器測試類定義:Module_map

頭文件:#include
容器定義:std::vector vertor_info;

其中int爲容器裏面所存儲的類型,可以是指針和結構體。

class Module_map : public CPP_Public
{
public:
	Module_map();
	~Module_map();
	void Init();
	void Module_Func_Run();

private:
	void Show_info(std::map<int,int> &info);
	void Show_info(std::map<int,std::string> &info);
	void Show_info(std::map<const char *,CAPP_info> &info);
	int Find_info(const int info);
	int Find_info(const char *pinfo);


private:
	std::map<int,int> 				m_map_int_info;
	std::map<int,std::string> 			m_map_string_info;
	std::map<const char *,CAPP_info> 	m_map_struct_info;
};

##map測試類的構造和析構函數
構造和析構函數初始化成員函數。

Module_map::Module_map()
{
	m_map_int_info.clear();
	m_map_string_info.clear();
	m_map_struct_info.clear();
}

Module_map::~Module_map()
{
	m_map_int_info.clear();
	m_map_string_info.clear();
	m_map_struct_info.clear();
}

map測試類的初始化

map的初始化一般有三種:
1、 直接初訪問下標初始化
2、 通過map<const char *,CAPP_info>::value_type進行初始化
3、 通過std::pair<const char *,CAPP_info>進行初始化

void Module_map::Init()
{
	int i = 0;
	CAPP_info Input_info = {0};
	
	for(i = 0;i < 10;i++)
	{
		m_map_int_info[i] = (i+3)*6;
	}

	cout << "map int number is " <<m_map_int_info.size() << endl;

   	m_map_string_info.insert(pair<int,string>(0, string("Test map string 1")));
	m_map_string_info.insert(pair<int,string>(1, string("Test map string 2")));
	m_map_string_info.insert(pair<int,string>(1, string("Test map string 2")));	//相同的key,不同的value
	m_map_string_info.insert(pair<int,string>(2, string("Test map string 3")));
	m_map_string_info.insert(pair<int,string>(2, string("Test map string 4")));	
	m_map_string_info.insert(pair<int,string>(3, string("Test map string 4")));
	m_map_string_info.insert(pair<int,string>(5, string("Test map string 4")));	//不同的key,相同的value

	cout << "map string number is " <<m_map_string_info.size() << endl;


	sprintf(Input_info.name,"list struct test 1");
	Input_info.number = 3;
    m_map_struct_info.insert(map<const char *,CAPP_info>::value_type ("Test map struct 1",Input_info));

	sprintf(Input_info.name,"list struct test 2");
	Input_info.number = 5;
    m_map_struct_info.insert(map<const char *,CAPP_info>::value_type ("Test map struct 2",Input_info));


	std::pair<const char *,CAPP_info> Info;

	sprintf(Input_info.name,"list struct test 3");
	Input_info.number = 8;

	Info.first = "Test map struct 3";
	Info.second = Input_info;
	
    m_map_struct_info.insert(Info);	
	
	cout << "map struct number is " <<m_map_struct_info.size() << endl;
	
}

執行結果:

$ ./project.o 
map int number is 10
map string number is 5
map struct number is 3
$

##map測試類內容的顯示,取出map內容
通過對類成員的迭代子來訪問map中的內容。

void Module_map::Show_info(std::map<int,int> &info)
{
	std::map<int,int>::iterator iter = info.begin();      

	while(iter != info.end())
	{
		cout << "int map info first is " << iter->first <<endl; 
		cout << "int map info second is " <<iter->second <<endl;
		iter++;
	}
}

void Module_map::Show_info(std::map<int,std::string> &info)
{
	std::map<int,std::string>::iterator iter = info.begin();

	while(iter != info.end())
	{
		cout << "string map info first is " << iter->first <<endl; 
		cout << "string map info second is " <<iter->second <<endl;
		iter++;
	}
}

void Module_map::Show_info(std::map<const char *,CAPP_info> &info)
{
	std::map<const char *,CAPP_info>::iterator iter = info.begin();
	CAPP_info Output_info = {0};
	while(iter != info.end())
	{
		Output_info = (CAPP_info)iter->second;
		cout << "struct map info first is " << iter->first <<endl; 
		cout << "struct map info second name is " <<Output_info.name <<endl;
		cout << "struct map info second number is " <<Output_info.number <<endl;
		iter++;
	}
}

執行結果:

$ ./project.o 
int map info first is 0
int map info second is 18
int map info first is 1
int map info second is 24
int map info first is 2
int map info second is 30
int map info first is 3
int map info second is 36
int map info first is 4
int map info second is 42
int map info first is 5
int map info second is 48
int map info first is 6
int map info second is 54
int map info first is 7
int map info second is 60
int map info first is 8
int map info second is 66
int map info first is 9
int map info second is 72
string map info first is 0
string map info second is Test map string 1
string map info first is 1
string map info second is Test map string 2
string map info first is 2
string map info second is Test map string 3
string map info first is 3
string map info second is Test map string 4
string map info first is 5
string map info second is Test map string 4
struct map info first is Test map struct 1
struct map info second name is list struct test 1
struct map info second number is 3
struct map info first is Test map struct 2
struct map info second name is list struct test 2
struct map info second number is 5
struct map info first is Test map struct 3
struct map info second name is list struct test 3
struct map info second number is 8
$  

可以看出,相同的key只會保留最先註冊的那一個,但相同的value不同的key可以並存。

搜索map容器內容

搜索容器map的內容是通過find(key)函數進行搜索的,通過傳入key值,進行搜索容器內的value值。

int Module_map::Find_info(const int info)
{
	std::map<int,std::string>::iterator iter = m_map_string_info.find(info);

	if(iter != m_map_string_info.end())
	{
		cout << "string map info find,string is " << iter->second << endl;
		return TYPE_YES;
	}
	else
	{
		cout << "string map info not find." << endl;
		return TYPE_NO;
	}
}

int Module_map::Find_info(const char *pinfo)
{
	std::map<const char *,CAPP_info>::iterator iter = m_map_struct_info.find(pinfo);

	if(iter != m_map_struct_info.end())
	{
		cout << "struct map info find,name is " << iter->second.name << endl;
		cout << "struct map info find,number is " << iter->second.number << endl;
		return TYPE_YES;
	}
	else
	{
		cout << "string map info not find." << endl;
		return TYPE_NO;
	}
} 

運行代碼

	Find_info(3);
	Find_info("Test map struct 3");

執行結果

 $ ./project.o 
string map info find,string is Test map string 4
struct map info find,name is list struct test 3
struct map info find,number is 8
$

保存多個key的map:multimap

定義一個multimap,能夠保存多個key值

std::multimap<int, std::string> 	m_multimap_string_info;

初始化

	m_multimap_string_info.insert(pair<int, string>(2, string("Test multimap string 2.1")));
	m_multimap_string_info.insert(pair<int, string>(2, string("Test multimap string 2.2")));
	m_multimap_string_info.insert(pair<int, string>(2, string("Test multimap string 2.3")));
	m_multimap_string_info.insert(pair<int, string>(3, string("Test multimap string 3")));
	m_multimap_string_info.insert(pair<int, string>(5, string("Test multimap string 5")));

	cout << "multimap number is " << m_map_struct_info.size() << endl;
	cout << "multimap key 2 number is " << m_multimap_string_info.count(2) << endl;
	cout << "multimap key 3 number is " << m_multimap_string_info.count(3) << endl;
	cout << "multimap key 4 number is " << m_multimap_string_info.count(4) << endl;

執行結果

multimap number is 3		//相同的key只統計一遍
multimap key 2 number is 3
multimap key 3 number is 1
multimap key 4 number is 0

遍歷

void Module_map::Show_info(const std::multimap<int, std::string> &info) const 
{
	std::multimap<int, std::string>::const_iterator iter = info.begin();

	while (iter != info.end()) {
		std::multimap<int, std::string>::const_iterator keyBegin = info.lower_bound(iter->first);

		cout << "multimap key " << iter->first  << "number is " << info.count(iter->first) << endl;

		while (keyBegin != info.upper_bound(iter->first)) {
			cout << "multimap first is " << keyBegin->first;
			cout << " second is " << keyBegin->second << endl;
			keyBegin++;
		}
		iter = keyBegin;
	}
}

執行結果

multimap key 2number is 3
multimap first is 2 second is Test multimap string 2.1
multimap first is 2 second is Test multimap string 2.2
multimap first is 2 second is Test multimap string 2.3
multimap key 3number is 1
multimap first is 3 second is Test multimap string 3
multimap key 5number is 1
multimap first is 5 second is Test multimap string 5

#string容器
##string容器初始化方法

string容器的初始化方法有很多,但大多數用到的就爲以下幾個

	string string_info = string("Test string");

	cout << "string name is " << string_info << endl;
	cout << "string size is " << string_info.size() << endl;		//得到string容器字符串的大小
	cout << "string length is " << string_info.length() << endl;	//得到string容器字符串的長度
	
	string str1 = "Test string 1";
	string str2 = string(str1,6);			    //從字符串str1下標6開始初始化,str1 = "tring 1"
	string str3 = string(6,'v');			    //初始化6個字符'v',str3 = "vvvvvv"
	string str4 = string_info + ' ' + str1;		//字符串相加 str4 = "Test string Test string 1"
	string str5 = string("numbertest",2,5);	//從字符串下標2開始,往後初始化5個字符 str5 = "mbert"
	
	cout << "str1 is " << str1 << endl;	
	cout << "str2 is " << str2 << endl;
	cout << "str3 is " << str3 << endl;
	cout << "str4 is " << str4 << endl;
	cout << "str5 is " << str5 << endl;

執行結果:

$ ./project.o 
string name is Test string
string size is 11
string length is 11
str1 is Test string 1
str2 is tring 1
str3 is vvvvvv
str4 is Test string Test string 1
str5 is mbert
$

發佈了52 篇原創文章 · 獲贊 34 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章