1. 程式人生 > 實用技巧 >STL 之vector string

STL 之vector string

1、vector容器,可以理解為陣列,可以理解為單端陣列,可以動態擴充套件(重新開闢一片更大空間,把原有的資料再拷貝進去,釋放原來的空間)既可以存放內建資料型別,又可以存放自定義資料型別。

  (1)vector存放內建資料型別

 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 using  namespace std;
 5 void print(int val){
 6     cout << val << " ";
 7 }
 8 void test01(){
9 vector<int> v; //存放內建資料型別 無參構造 vector<int> v1(v.begin(),v.end()); 10 //向容器插入元素 11 v.push_back(1); 12 v.push_back(2); 13 v.push_back(3); 14 //第一種遍歷方式 15 vector<int>::iterator itBegin = v.begin(); //起始迭代器 指向容器中的第一個位置 16 vector<int>::iterator itEnd = v.end();//
指向容器中最後一個元素的下一個位置 17 while (itBegin!=itEnd) 18 { 19 cout << *itBegin << " "; 20 itBegin++; 21 } 22 cout << endl; 23 //第二種 24 for (vector<int>::iterator it = v.begin(); it != v.end(); it++){ 25 cout << *it << " "; 26 }
27 //第三種 stl提供的演算法 28 for_each(v.begin(), v.end() , print); 29 30 } 31 int main(){ 32 test01(); 33 system("pause"); 34 }

  上面中例子使用的是vector的預設構造,也就是無參構造,還有三種建構函式,分別區間構造、n個elem構造、拷貝構造,例如:

1 vector<int> v1(v.begin(),v.end()); //區間方式構造
2 
3 vector<int > v2(10,1);  //v2裡面有10個1
4 
5 vector<int > v3(v2)  //拷貝構造

  (2)vector存放自定義資料型別

 1 #include<iostream>
 2 #include<vector>
 3 #include<string>
 4 #include<algorithm>
 5 using namespace std;
 6 class Person{
 7 public:
 8     Person(string name,int age){
 9         this->m_Name = name;
10         this->m_Age = age;
11     }
12     string m_Name;
13     int m_Age;
14 };
15 void print(Person p){
16     cout << p.m_Name << " ";
17     cout << p.m_Age << endl;
18 }
19 void test01(){
20     vector<Person>v;
21     Person p1("aa", 12);
22     Person p2("bb", 13);
23     Person p3("cc", 14);
24     //向容器中插入資料
25     v.push_back(p1);
26     v.push_back(p2);
27     v.push_back(p3);
28     
29     //遍歷
30     for_each(v.begin(), v.end(), print);
31     for (vector<Person>::iterator it = v.begin();it != v.end(); it++){ //it指標
32         cout << it->m_Name << " " << it->m_Age << endl;
33     }
34 }
35 void print1(Person *p){
36     cout << (p)->m_Age << " " << p->m_Name << endl;
37 }
38 void test02(){
39     vector<Person *> v1;
40     Person p1("tom", 18);
41     Person p2("tom", 19);
42     v1.push_back(&p1);
43     v1.push_back(&p2);
44     for_each(v1.begin(), v1.end(), print1);
45     for (vector<Person*>::iterator it = v1.begin(); it != v1.end(); it++){
46         cout << (*it)->m_Name << " " << (*it)->m_Age << endl;
47     }
48 }
49 int main(){
50     /*test01();*/
51     test02();
52     system("pause");
53 }

  (3)vector容器巢狀

 1 #include<iostream>
 2 #include<vector>
 3 #include<string>
 4 using namespace std;
 5 void test01(){
 6     vector<vector<int>>v;
 7     //建立小容器
 8     vector<int>v1;
 9     vector<int>v2;
10     vector<int>v3;
11     //往小容器中插入資料
12     for (int i = 0; i < 3; i++)
13     {
14         v1.push_back(i + 1);
15         v2.push_back(i + 2);
16         v3.push_back(i + 3);
17     }
18     //在大容器中插入小容器
19     v.push_back(v1);
20     v.push_back(v2);
21     v.push_back(v3);
22     //遍歷
23     for (vector<vector<int>>::iterator it = v.begin(); it != v.end();it++)
24     {
25         for (vector<int>::iterator it1 = (*it).begin(); it1!= (*it).end();it1++)
26         {
27             cout << *it1 << " ";
28         }
29         cout << endl;
30     }
31 
32 }
33 int main(){
34     test01();
35     system("pause");
36 }

(4)vector賦值操作

 1 //1、operator=賦值
 2 //把v1裡面的值賦值給v2
 3 vector<int> v2;  //預設構造
 4 v2=v1;
 5 
 6 //2、assign區間賦值
 7 vector<int> v2 ;  //預設構造
 8 v2.assign(v1.begin(),v2.end());  //區間開閉後開
 9 
10 //3、assign n個元素的方式賦值
11 vector<int > v2 ;  //預設構造
12 v2.assign(10,2);

(5)vector的容量和大小

 1     vector<int>v1;
 2     v1.push_back(1);
 3     v1.push_back(2);
 4     v1.push_back(3);
 5     v1.push_back(4);
 6 
 7     if (v1.empty())
 8     {
 9         cout << "v1為空" << endl;
10     }
11     //v1.resize(12);//重新指定大小,超出部分預設用0擴充
12     v1.resize(12, 1); //指定用1擴充
13     int cap=v1.capacity();  //容器容量
14     
15     cout << "v1的容量" << cap << endl;  //容量永遠大於或者等於size()
16     int size = v1.size();  //容器大小
17     cout << "size=" << size << endl;

(6)vector的插入和刪除

1 vector<int>v1;
2 for (int i = 0; i < 10; i++)
3 {
4     v1.push_back(i);   //尾插法
5 }
6v1.insert(v1.begin(),2, 12);  //通過迭代器插入資料,在起始位置,插入兩個12
7 v1.erase(v1.begin());//刪除第一個元素
8 v1.erase(v1.begin(), v1.end()); //刪除區間元素相當於清空
9 v1.clear();//清空

(7)vector資料存取

 1     vector<int>v1;
 2     for (int i = 0; i < 10; i++)
 3     {
 4         v1.push_back(i);   //尾插法
 5     }
 6     //通過[]訪問
 7     for (int i = 0; i < v1.size(); i++)
 8     {
 9         cout << v1[i] << " ";
10     }
11     cout << endl;
12     //通過at方式訪問
13     for (int i = 0; i < v1.size(); i++)
14     {
15         cout << v1.at(i) << " ";
16     }
17     cout << endl;
18     cout<<"第一個元素是:"<<v1.front()<<endl;
19     cout<<"最後一個元素:"<<v1.back()<<endl;

2、string容器,內部封裝了char*,管理字串,是一個char*型的容器。

(1)string的建構函式;

    

 1 //空構造
 2 string();
 3 string s1;
 4 //使用字串s初始化
 5 string(const char*s);
 6 const char* s="hi";
 7 string s2(s);
 8 //使用string物件初始化另一個string物件,拷貝構造
 9 string(const string&s);
10 string s3(s2);
11 //n個字元
12 string (int n,char c);
13 string s4(3,'d');

(2)string賦值操作

 1 const char *p = "hello world";
 2     string s1;
 3     s1 = p;   //s1="hello world"
 4     cout << "s1=" << s1 << endl;
 5 
 6     string s2 = s1;
 7     cout << "s2=" << s2 << endl;
 8 
 9     string s4;
10     s4.assign("hello world");
11     cout << "s4=" << s4 << endl;
12 
13     string s5;
14     s5.assign("hello world", 5);
15     cout << "s5=" << s5 << endl;
16 
17     string s6;
18     s6.assign(s5);
19     cout << "s6=" << s6 << endl;
20 
21     string s7;
22     s7.assign(10, 'a');
23     cout << "s7=" << s7 << endl;

(3)string拼接

  

 1 //1、+=方式
 2     string str1 = "I like ";
 3     str1 += "cat";
 4     cout << "str1=" << str1 << endl;
 5 
 6     str1 += ':';
 7     cout << "str1=" << str1 << endl;
 8 
 9     string str2 = "tom ";
10     str1 += str2;
11     cout << "str1=" << str1 << endl;
12 
13     //2、append方式
14     str1.append("miaomiao");
15     cout << "str1=" << str1 << endl;
16 
17     str1.append("miaowu", 4);
18     cout << "str1=" << str1 << endl;
19 
20     str1.append(str2);
21     cout << "str1=" << str1 << endl;
22 
23     str1.append(str2, 0, 2);  //從0號位置開始擷取兩位
24     cout << "str1=" << str1 << endl;

(4)string查詢和替換

1     string str1 = "abcdefde";
2     int pos=str1.find("de");
3     cout << "pos=" << pos << endl;   //3  find從左往右查詢
4     pos = str1.rfind("de");
5     cout << "pos=" << pos << endl;   //6  rfind從右往左找
1     string str1 = "absdf";
2     str1.replace(0, 2, "000");  //從0號位置起2個字元替換為000
3     cout << "str1=" << str1 << endl;    //000sdf

(5)字串比較

1 string str1="hello";
2 string str2 = "hello";
3 int ret =str1.compare(str2);
4 if(ret==0)
5 {
6    //字串相同  
7 }

(6)字元存取,通過“[]”或者“at”方式對字串進行讀和寫。

1     string str1 = "hello";
2     for (int i = 0; i < str1.size(); i++)
3     {
4         //cout << str1[i] << " ";    //通過[]的方式訪問
5         cout << str1.at(i) << " ";   //通過at的方式訪問
6     }
1     str1[0] = 'x';
2     str1.at(1) = 'x';
3     cout << "str1=" << str1 << endl;    //hello-->xxllo

(7)string 的插入和刪除

1 string str="hello";
2 str.insert(0,"aaa");   //在第0個位置之前插入aaa  hello -->aaahello
3 str.erase(0,3);  //從0位置起刪除3個  aaahello--->hello

(8)從字串種獲取想要的字串

1     string str1 = "abcdef";
2     string substr = str1.substr(1, 3);   //從1號位置擷取3個
3     cout << "substr=" << substr << endl;
4     //實用操作  ,從郵箱中獲取name
5     string str2 = "[email protected]";
6     int pos = str2.find('@');   //pos=6
7     string name = str2.substr(0, pos);
8     cout << "name=" << name << endl;