日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

String和STL的一些基础知识

發布時間:2024/7/23 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 String和STL的一些基础知识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.STL(標準模板庫)的六大組件:容器,算法,迭代器,仿函數,適配器(配接器),空間配置器

1.容器:各種數據結構,vector,list,deque,unordered_set;
2.算法:各種常用算法,sort,find,copy;
3.迭代器:扮演了容器與算法之間的膠合劑,他兩之間的橋梁;
4.仿函數:行為類似函數,可作為算法的某種策略;
5.適配器: 一種用來修飾容器或者仿函數或迭代器接口的東西;
6.空間配置器:負責空間的配置與管理。

1.vector

1.1特點,讀取能在常數時間完成,要注意的是動態擴展不是在原空間基礎上擴展空間,而是開辟更大的內存空間,然后將數據拷貝到新空間,釋放原空間。

1.2初始化vector的一些方式,其實就是不同的構造函數實現:

1.3 賦值操作

void test06(){vector<int> v(10,1);cout<<"==v[0]:"<<v[0]<<endl;vector<int> v2(v);cout<<"==v2[0]:"<<v2[0]<<endl;vector<int> v3;v3 = v2;cout<<"==v3[0]:"<<v3[0]<<endl;vector<int> v4;v4.assign(v3.begin(), v3.end()-1);cout<<"===v4[0]:==="<<v4[0]<<endl;cout<<"===v4.size():==="<<v4.size()<<endl;vector<int> v5;v5.assign(10, 1);cout<<"===v4[0]:==="<<v5[0]<<endl;cout<<"===v4.size():==="<<v5.size()<<endl; }

1.4 容量和大小

capacity大于等于size,resize默認用0填充,也可以自定義填充元素。

void test06(){vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);cout<<"===v.empty():==="<<v.empty()<<endl; //0 buweikong 1 weikongcout<<"===v.capacity():==="<<v.capacity()<<endl; //cout<<"===v.size():==="<<v.size()<<endl; // //default use 0 padv.resize(10);cout<<"==v[5]:"<<v[5]<<endl;cout<<"===v.capacity():==="<<v.capacity()<<endl; //cout<<"===v.size():==="<<v.size()<<endl; ////use 100 padv.resize(10, 100);cout<<"==v[5]:"<<v[5]<<endl;cout<<"===v.capacity():==="<<v.capacity()<<endl; //cout<<"===v.size():==="<<v.size()<<endl; // }

1.5 插入與刪除

void printvector(vector<int>& v){for(int i=0; i<v.size(); i++){cout<<v[i]<<" ";}cout<<endl; } void test06(){vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);printvector(v);v.insert(v.begin(), 1);printvector(v);v.insert(v.begin()+1, 2,10);printvector(v);v.erase(v.begin());printvector(v);v.erase(v.begin(), v.end()-1);printvector(v); }

1.6 數據存取

void test06(){vector<int> v(10, 100);cout<<v[0]<<endl;cout<<v.at(0)<<endl;cout<<"v.front()"<<v.front()<<endl;cout<<"v.back()"<<v.back()<<endl; }

1.7 元素互換

void printvector(vector<int>& v){for(int i=0; i<v.size(); i++){cout<<v[i]<<" ";}cout<<endl; } void test06(){vector<int> v1(10, 100);vector<int> v2(10, 99);cout<<"before swap"<<endl;printvector(v1);printvector(v2);v1.swap(v2);cout<<"after swap"<<endl;printvector(v1);printvector(v2); }

利用swap減少內存

void printvector(vector<int>& v){for(int i=0; i<v.size(); i++){cout<<v[i]<<" ";}cout<<endl; } void test06(){vector<int> v;for(int i=0; i<10000; i++){v.push_back(i);}cout<<"v capacity is: "<<v.capacity()<<endl;cout<<"v size is: "<<v.size()<<endl;printvector(v);v.resize(3);cout<<"v capacity is: "<<v.capacity()<<endl;cout<<"v size is: "<<v.size()<<endl;printvector(v);vector<int>(v).swap(v);cout<<"v capacity is: "<<v.capacity()<<endl;cout<<"v size is: "<<v.size()<<endl;printvector(v); }

1.8 預留空間

利用reserve減少開辟空間次數

void test06(){vector<int> v;int *p;int num = 0;for(int i=0; i<100000; i++){v.push_back(i);if (p != &v[0]){p = &v[0];num++;}}cout<<num<<endl;vector<int> v2;v2.reserve(100000);int *p2;int num2 = 0;for(int i=0; i<100000; i++){v.push_back(i);if (p2 != &v[0]){p2 = &v[0];num2++;}}cout<<num2<<endl; }

1.9遍歷方式:
(1).普通遍歷方法;
(2).迭代器遍歷方法與示例:

(3)for_each方法:

#include <iostream> #include <vector> #include <algorithm> using namespace std;void myPrint(int val){cout<<val<<endl; } int main() {vector<int> v;v.push_back(10);v.push_back(12);v.push_back(13);for_each(v.begin(), v.end(), myPrint); }

上述遍歷方式的代碼:

#include <iostream> #include <string> #include <vector> #include <list> #include <map>using namespace std;int main() { vector <int> vec;vec.push_back(10);//尾部插入數據vec.push_back(4);//尾部插入數據vec.push_back(6);//尾部插入數據vec.push_back(3);//尾部插入數據cout<<"vec.size():"<<vec.size()<<endl;//打印長度vec.pop_back();//拿掉尾部數據 cout<<"vec.size():"<<vec.size()<<endl;//打印長度//一般遍歷for (int i=0;i<vec.size();i++){cout<<"vec[i]:"<<vec[i]<<endl;}vector <int>::iterator itor = vec.begin();cout<<"*itor:"<<*itor<<endl;for (;itor!=vec.end();itor++){cout<<"*itor:"<<*itor<<endl;}cout<<"vec.front():"<<vec.front()<<endl;cout<<"vec.back():"<<vec.back()<<endl;return 0; }

1.10?vector存放自定義數據,一種是存放對象,一種是存放指針

#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std;class Person{public:Person(string name, int age){m_Name = name;m_age = age;};string m_Name;int m_age; };void test_01(){vector<Person> p;Person p1("aaa",111);Person p2("bbb",222);Person p3("ccc",333);p.push_back(p1);p.push_back(p2);p.push_back(p3);for(int i=0; i<p.size(); i++){cout<<"===p[i].m_Name==="<<p[i].m_Name<<endl;cout<<"===p[i].m_age===="<<p[i].m_age<<endl;} }void test_02(){vector<Person*> p;Person p1("aaa",111);Person p2("bbb",222);Person p3("ccc",333);p.push_back(&p1);p.push_back(&p2);p.push_back(&p3);for(int i=0; i<p.size(); i++){cout<<"===p[i]->m_Name==="<<p[i]->m_Name<<endl;cout<<"===p[i]->m_age===="<<p[i]->m_age<<endl;} } int main() {//test_01();cout<<"=================="<<endl;test_02(); }

1.11 初始化二維vector

vector<vector<int> > dp(n + 1, vector<int>(m + 1, 0));

初始化通過另一個vector賦值方式:

vector<int> a(10, 1);vector<int> res(a.begin(), a.begin() + 2);for(int i = 0; i < res.size(); i++){cout<<"==res[i]=="<<res[i]<<endl;}

1.12 vector轉mat

(1)一維vectot轉cv::mat

std::vector<float> result_feature(10);for(int i=0; i<10;i++){cout<<"==result_feature[i]:"<<result_feature[i]<<endl;}cv::Mat heatmap(result_feature);cout<<"==heatmap:"<<heatmap<<endl;

?(2)二維vectot轉cv::mat

////#include <pybind11/numpy.h> //#include <a.h> //#include <b.h> #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <string> #include <algorithm> #include <vector> #include <memory>typedef cv::Vec<double, 5> Vec5d; using namespace std;void debug(std::vector<std::vector<float>> angles, std::string name){cv::Mat matAngles(angles.size(), angles.at(0).size(), CV_32FC(1));for(int i=0; i<matAngles.rows; ++i)for(int j=0; j<matAngles.cols; ++j)matAngles.at<float>(i, j) = angles[i][j];std::cout<<name<<matAngles.size<<std::endl;std::cout<<name<<matAngles<<std::endl;}int main(int argc, char** argv) {vector<vector<float>> angles;for(int i=0; i<10; i++){vector<float> temp;for(int j=0; j<5; j++){temp.push_back(float(i+j));}angles.push_back(temp);}debug(angles, "test_name"); }

cv::Mat debug(std::vector<std::vector<float>> angles, std::string name){cv::Mat matAngles(angles.size(), angles.at(0).size(), CV_32FC(1));for(int i=0; i<matAngles.rows; ++i)for(int j=0; j<matAngles.cols; ++j)matAngles.at<float>(i, j) = angles[i][j];// std::cout<<name<<matAngles.size<<std::endl;return matAngles;}std::vector<std::vector<float>> result_feature2(10, std::vector<float>(10));cv::Mat heatmap2 = debug(result_feature2, "test");cout<<"==heatmap2:"<<heatmap2<<endl;

?1.13? .data()

在c++11中,vector 增加了data()的用法,它返回內置vecotr所指的數組內存的第一個元素的指針。

std::vector<int> myvector (5,1);int* p = myvector.data();*p = 10;++p;*p = 20;p[2] = 100;cout<<"myvector[1]:"<<myvector[1]<<endl;std::cout << "myvector contains:";for (size_t i=0; i<myvector.size(); ++i){std::cout << ' ' << myvector[i];} int* p1 = myvector.data();std::cout << "\n *p1 contains:";for (size_t i=0; i<myvector.size(); ++i){std::cout << ' ' << *p1;++p1;} std::cout << '\n';

??

1.14 find

std::find(v.begin(), v.end(), key) != v.end()

2.鏈表

特點 數據插入快

#include <iostream> #include <string> #include <vector> #include <list> #include <map>using namespace std;int main() { list<int>::iterator itor = list1.begin();for(;itor!=list1.end();itor++){cout<<*itor<<endl;}return 0; }

3.map

特點 key value形式

3.1:用insert插入

#include <iostream> #include <string> #include <vector> #include <list> #include <map>using namespace std;int main() { map<int, string> m;pair<int, string> p1(3,"hello");pair<int, string> p2(6,"world");pair<int, string> p3(8,"beijing");m.insert(p1);m.insert(p2);m.insert(p3);cout<<m[3]<<endl;cout<<m[6]<<endl;map<int,string>::iterator itor = m.begin();for(;itor!=m.end();itor++){cout<<itor->first<<" "<<itor->second<<endl;}return 0; }

3.2:幾種插入方式

#include <map> int main() { map<int, string> mapStudent;// 第一種 用insert函數插入pairmapStudent.insert(pair<int, string>(000, "student_zero"));// 第二種 用insert函數插入value_type數據mapStudent.insert(map<int, string>::value_type(001, "student_one"));// 第三種 用"array"方式插入mapStudent[123] = "student_first";// cout<<mapStudent[123]<<endl;map<int, string > ::iterator it;for(it=mapStudent.begin(); it!=mapStudent.end(); it++) cout<<it->first<<" "<<it->second<<endl; auto start = std::chrono::system_clock::now();//開始時間for (int i=0; i<1e6;i++){}auto end = std::chrono::system_clock::now();//結束時間std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms" << std::endl;return 0; }

3.3 拷貝構造函數方式實現 map

void printmap(map<int,int> m){map<int, int>::iterator it;for(it = m.begin(); it != m.end(); it++){cout<<"key="<<it->first<<" value="<<it->second<<endl;} } void test06(){map<int,int> m1;m1[0] = 1;//拷貝構造函數方式實現map<int,int> m2(m1);printmap(m1);printmap(m2); } int main() {test06(); }

3.4 map的一些api

查看size和交換數據等

void printmap(map<int,int> m){map<int, int>::iterator it;for(it = m.begin(); it != m.end(); it++){cout<<"key="<<it->first<<" value="<<it->second<<endl;}cout<<endl; } void test06(){map<int,int> m1;m1[0] = 1;m1[1] = 100;cout<<"==m1.size():"<<m1.size()<<endl;cout<<"==m1.empty():"<<m1.empty()<<endl;map<int,int> m2;m2[0] = 1000;m2[10] = 10000;cout<<"before swap"<<endl;printmap(m1);printmap(m2);m2.swap(m1);cout<<"after swap"<<endl;printmap(m1);printmap(m2);} int main() {test06(); }

插入與刪除

void printmap(map<int,int> m){map<int, int>::iterator it;for(it = m.begin(); it != m.end(); it++){cout<<"key="<<it->first<<" value="<<it->second<<endl;}cout<<endl; } void test06(){map<int,int> m1;m1[0] = 1;m1[2] = 200;m1.insert(pair<int, int>(10, 1000));m1.insert(make_pair(1, 100));cout<<"==m1.size():"<<m1.size()<<endl;cout<<"==m1.empty():"<<m1.empty()<<endl;cout<<"==before erase=="<<endl;printmap(m1);m1.erase(m1.begin());m1.erase(10); //按照key 刪除cout<<"==after erase1=="<<endl;printmap(m1);m1.clear();//清空m1.erase(m1.begin(), m1.end());cout<<"==after erase2=="<<endl;printmap(m1);} int main() {test06(); }

查找與統計

void test06(){map<int,int> m1;m1[0] = 1;m1[2] = 200;m1.insert(pair<int, int>(10, 1000));m1.insert(make_pair(1, 100));cout<<"==m1.size():"<<m1.size()<<endl;cout<<"==m1.empty():"<<m1.empty()<<endl;map<int, int>::iterator pos = m1.find(2);if(pos != m1.end()){cout<<"find key="<<pos->first<<",value="<<pos->second<<endl;}else{cout<<"not find key"<<endl;}int number = m1.count(2);cout<<"==number:"<<number<<endl; }

map排序

本來 map打印結果是默認key從小到大的,通過仿函數可以修改打印的順序,比如改為從大到小打印

class MyCompare{ public:bool operator()(int v1, int v2){//jiangxureturn v1 > v2;} };void printmap(map<int, int, MyCompare> m){map<int, int, MyCompare>::iterator it;for(it = m.begin(); it != m.end(); it++){cout<<"key="<<it->first<<" value="<<it->second<<endl;}cout<<endl; }void test06(){map<int, int, MyCompare> m1;m1[2] = 200;m1[0] = 1;m1.insert(pair<int, int>(10, 1000));m1.insert(make_pair(1, 100));printmap(m1); } int main() {test06(); }

3.5 c++實現argsort

#include <vector> #include <iostream>using namespace std;template<typename T> vector<int> sort_indexes(const vector<T> & v, bool reverse=false) {// initialize original index locationsvector<int> idx(v.size());for (int i = 0; i != idx.size(); ++i) idx[i] = i;// sort indexes based on comparing values in vif(reverse){sort(idx.begin(), idx.end(),[& v](int i1, int i2) {return v[i1] > v[i2];});}else{sort(idx.begin(), idx.end(),[& v](int i1, int i2) {return v[i1] < v[i2];});}return idx; }int main() {int arr[] = {2,3,4,5,63,4,32,3};vector<int> l(arr, arr+8);// for(int i= 0; i < l.size(); i++)// {// cout << l[i] << " ";// }vector<int> sorted_indx;sorted_indx = sort_indexes(l);cout << "ascending sorted: ";for(int i= 0; i < sorted_indx.size(); i++){cout << sorted_indx[i] << " ";}cout << endl;sorted_indx = sort_indexes(l, true);cout << "descending sorted: ";for(int i= 0; i < sorted_indx.size(); i++){cout << sorted_indx[i] << " ";}cout << endl;return 0; }

4.unordered_set

類似python set

#include <unordered_set> using namespace std; int main(){ std::unordered_set<int> uset;uset.insert(1);uset.insert(1);uset.insert(2);for(int u_:uset){cout<<u_<<endl;}return 0; }

find

5.std::partial_sort與std::partial_sort_copy

這兩都是取topk進行排序,區別在于前者直接修改,后者開出一個新區域.

// // Created by fzh on 2021/6/22. ////#include <pybind11/numpy.h> //#include <a.h> //#include <b.h> #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <string> #include <algorithm> #include <vector> #include <memory>typedef cv::Vec<double, 5> Vec5d; using namespace std;//以函數對象的方式自定義排序規則 class mycomp2 { public:bool operator() (int i, int j) {return (i > j);} };int main(int argc, char** argv) {std::vector<int> myvector1{ 3,2,5,4,1,6,9,7};//以默認的升序排序作為排序規則,將 myvector 中最小的 4 個元素移動到開頭位置并排好序std::partial_sort(myvector1.begin(), myvector1.begin() + 4, myvector1.end());cout << "第一次排序:\n";// for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)// std::cout << *it << ' ';for(int i = 0; i<myvector1.size(); i++){std::cout << myvector1[i] << ' ';}cout << "\n第二次排序:\n";// 以指定的 mycomp2 作為排序規則,將 myvector 中最大的 4 個元素移動到開頭位置并排好序std::partial_sort(myvector1.begin(), myvector1.begin() + 4, myvector1.end(), mycomp2());// for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)// std::cout << *it << ' ';for(int i = 0; i<myvector1.size(); i++){std::cout << myvector1[i] << ' ';}std::vector<int> myvector2{ 3,2,5,4,1,6,9,7};cout << "\npartial_sort_copy:\n";std::vector<int> myvector3(5, 0); std::partial_sort_copy(myvector2.begin(), myvector2.end(), myvector3.begin(), myvector3.begin()+5);for(int i = 0; i<myvector2.size(); i++){std::cout << myvector2[i] << ' ';}cout << "\n"<<endl;for(int i = 0; i<myvector3.size(); i++){std::cout << myvector3[i] << ' ';}return 0; }

二.string的一些基礎知識

1.string的本質是一個類,所有封裝了不少成員函數,而char* 是指針

string的構造函數如下:

代碼示例:

void test_03(){string s1;const char* c = "hahhahhah";string s2(c);cout<<"===s2:==="<<s2<<endl;string s3(s2);cout<<"===s3:==="<<s3<<endl;string s4(10,'a');cout<<"===s4:==="<<s4<<endl; }

2.string賦值的一些操作:

//string賦值操作 void test_01(){string str1;str1 = "hello";cout<<"===str1===:"<<str1<<endl;string str2;str2 = str1;cout<<"===str2===:"<<str2<<endl;string str3;str3 = 'a';cout<<"===str3===:"<<str3<<endl;string str4;str4.assign("hello c++"); //賦值全部字符串cout<<"===str4===:"<<str4<<endl;string str5;str5.assign("hello c++", 5); //賦值5個字符cout<<"===str5===:"<<str5<<endl;string str6;str6.assign(str5); //賦值5個字符cout<<"===str6===:"<<str6<<endl;string str7;str7.assign(10,'h'); //賦值5個字符cout<<"===str7===:"<<str7<<endl; } int main() {test_01(); }

3.string 字符串拼接

void test_02(){string str1 = "hello";string str2 = " c++";string str3;str3 = str1 + str2;cout<<"===str3===:"<<str3<<endl;str3 += " again";cout<<"===str3===:"<<str3<<endl;str3.append(str1);cout<<"===str3===:"<<str3<<endl;str3.append(str1, 1, 2);cout<<"===str3===:"<<str3<<endl; } int main() { // test_01();test_02(); }

4.字符串查找與替換

find從左往右找,rfind從右往左找

void test_03(){string str1 = "abcdebfg";int pos = str1.find("b"); //從左往右找cout<<"===pos===:"<<pos<<endl;int rpos = str1.rfind("b"); //從右往左找cout<<"===rpos===:"<<rpos<<endl; } int main() { // test_01(); // test_02();test_03(); }

void test_03(){string str1 = "abcdebfg";str1.replace(1, 3, "1111"); //將bcd替換為1111cout<<"===str1===:"<<str1<<endl; }

5.字符串比較

void test_03(){string str1 = "abcdebfg";string str2 = "abcd";const char *p = "abcd";int res1 = str1.compare(p);cout<<"===res1===:"<<res1<<endl;int res2 = str1.compare(str2);cout<<"===res2===:"<<res2<<endl; }

6.字符存取

void test04(){string str1 = "hello";cout<<"str1[0]:"<<str1[0]<<endl;cout<<"str1.at(0):"<<str1.at(0)<<endl;str1[0] = 'A';cout<<"===str1:==="<<str1<<endl; }

7.字符串的插入與刪除

void test05(){string str1 = "hello";str1.insert(0,"111");cout<<"===str1:==="<<str1<<endl;//deletestr1.erase(0,3);cout<<"===str1:==="<<str1<<endl; }

8.子串獲取

void test06(){string str1 = "hello";string substr = str1.substr(0, 3);cout<<"===str1:==="<<str1<<endl;cout<<"===substr:==="<<substr<<endl; }

void test06(){string email = "hello@qq.com";int pos = email.find("@");cout<<"===pos:==="<<pos<<endl;string name = email.substr(0,pos);cout<<"===name:==="<<name<<endl; }

總結

以上是生活随笔為你收集整理的String和STL的一些基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。