c++精进C++

C++ STL容器基本使用

2018-04-09  本文已影响0人  BookThief

一. 顺序容器:

二. 关联容器

STL 容器是泛型模板类,因此是通用的,可用于存储字符串、整型、结构或类对象。

三. STL:string

1. 为什么需要string类

字符数组可这样定义

char staticName[20];

避开这种限制, C++支持动态分配内存,因此可以如下定义更动态的字符数组:

char* dynamicName = new char [ArrayLength];
2. 实例化和复制 STL string

const char* constCStyleString = "Hello String!";

string strFromConst(constCStyleString);

string strFromConst = constCStyleString;

string str2("Hello Stringl");

string strPartialCopy(constCStyleString, 5);
string strRepeatChars(10, 'a');
3. 访问string内字符内容
string strSTLString('Hello String ' );

for(size_t num = 0;num<strSTLString.length();++num){
    cout<<strSTLString[num]<<endl;
}
string::const_iterator iCharacterLocator;
for (iCharacterLocator = strSTLString.begin(); iCharacterLocator != strSTLString.end (); 
++ iCharacterLocator)
    cout<<*iCharacterLocator<<endl;

4.拼接字符串

string strSample1('Hello');
string strSample2("String!");
strSample1 += strSample2;
strSample1.append(strSample2);
5.在 string 中查找字符或子字符串
string strSample("happy birthday!")
size_t charPos = strSample.find("day", 0); //从位置0开始
if (charPos != string::npos)
    cout <<"First instance of \"day\" was found at position " << charPos;
else
    cout <<"Substring not found." << endl;
6. 擦除string
string strSample("Hello Stringl Wake up to a beautiful dayl");
strSample.erase (13, 28); //Hello String!
strSample.erase(iCharS); 
strSample.erase(strSample.begin(), strSample.end()); 
7. 使用 auto 简化冗长的选代器声明
string::iterator iCharS = find(strSample.begin(), strSample.end(), 'S');

auto iCharS = find(strSample.begin(), strSample.end(), 'S');
8. 字符串反转
string strSample("Hello Stringl We will reverse you!");
reverse(strSample.begin(), strSample.end());
9. 字符串大小写转换
string strInput;
getline(cin, strInput);
transform(strInput.begin(), strInput.end(), strlnput.begin(), toupper); //大写
transform(strlnput.begin(), strlnput.end(), strlnput.begin(), tolower); //小写

四. STL动态数组vector类

1. 实例化vector
using namespace std;
vector<int> vecDynamiclntegerArray; // vector containing integers
vector<float> vecDynamicFloatArray; // vector containing floats
vector<Tuna> vecDynamicTunaArray; //包含对象

vector也有很多构造函数,初始化方式也多变

vector<int> vecone;
vector<int> vectwo(10);
vector<int> vecthree(10, 90);
vector<int> vecfour(vecthree);
vector<int> vecfive(vecthree.cbegin (), vecthree.cbegin () + 5 );
2. push_back()在末尾插入元素
vector <int> veclntegers;
veclntegers.push_back(50);
veclntegers.push_back(1);
vecIntegers.push_back(987);
veclntegers.push_back(1001);
cout << veclntegers.size()<<endl; //4 //请注意函数size()的用法,它返回vector 中存储的元素数。
vector<int> veclntegers = {50, 1, 987, 1001};
vector<int> vecMorelntegers {50, 1, 987, 1001};
3. 使用 insert()在指定位置插入元素
vecone.insert (vecone.begin(), 25);
veclntegers.insert (veclntegers.end(), 2 , 45);
vector<int> vecAnother(2, 30);
vecone.insert(vecone.begin() + 1,vecAnother.begin(), vecAnother.end());

插入位置的迭代器一般最好为:

  1. begin()或 end()返回的
  2. STL 算法(如find函数)的返回位,find可用于查找元素,然后在这个位置插入另一个元素(这将导致查找的元素向后移).

注意:

4. 数组语法访问vector元素
vector<int> vecone(5,10);
for(size_t num; num<vecone.size();++num)
    cout<<vecone[num]<endl;
    cout<<vecone.at(num)<<endl;

注意:

5. 使用指针(迭代器)访问vector元素
vector<int> vecone(5,10);
auto iLocator = vecone.begin();
while(iLocator != vecone.end()
{
    size_t index = distance(vecone.begin(),iLocator);//distance函数计算元素偏移量
    cout<<index<<':'<<*iLocator<<endl;
    ++iLocator;
}
6. pop_back删除vector末尾的元素
vector<int> vecone(10,90);
vecone.pop_back();
7. vector的大小和容量

vector的大小指的是实际存储的元素数,而vector的容量指的是在重新分配内存以存储更多元素
前vector能够存储的元素数。因此,vector的大小小于或等于容量。

vector.size();
vector.capacity();

五. STL 动态数组deque

deque<int> deqone;
1.使用 push_front 和 pop_front 在开头插入和删除元素
deque<int> deqone;
deqone.push_back(3);
deqone.push_back(4);
deqone.push_back(5);
deqone.push_front(2);
deqone.push_front(1);
deqone.push_front(0); // 0,1,2,3,4,5
deque.pop_back(); // 0,1,2,3,4
deque.pop_front(); //1,2,3,4

动态数组vector和deque总结

  1. 在不知道需要存储多少个元素时,务必使用动态数组vector或deque.
  2. 请牢记, vector只能在末端扩容,为此可使用方法push_back().
  3. 请牢记,deque可在两端扩容,为此可使用方法push_back()和push_front().
  4. pop_back()删除集合最后一个元素
  5. pop_front()删除deque开头元素

六.STL::list

1. 实例化list
list<int> lione(10);
list<int> litwo(10,90);
list<int> lithree(litwo);
vector<int> vecone(10,20);
list<int> lifour(vecone.begin(),vecone.end());
list<int>::const_iterator isite;
list<int>::iterator isite
2.list开头或末尾插入元素
list<int> lione(10);
lione.push_back(-1);
lione.push_front(2001);
3.在list中间插入元素,借助insert函数
iterator insert(iterator pos, const T& x);
void insert(iterator pos, size_type n, const T& x);
temp1ate <c1ass Inputlterator>
void insert(iterator pos, Inputlterator f, Inputlterator 1)
4. 删除list中元素,借助erase函数
listlntegers.erase(isite)
listlntegers.erase(listlntegers.begin() , listlntegers.end());
5. 对list元素进行反转
lione.reverse();
6. 对list元素进行排序
listlntegers.sort(); //递增顺序
bool SortPredicate_Descending(const int & lsh, const int& rsh)
{
    return(lsh > rsh); //优先找最大的,递减
}
listlntegers.sort(SortPredicate_Descending);

注意:

7. 总结

七.STL集合set

1. 实例化set对象
set<int> seone;
multiset<int> musone;
set<int>::const_iterator isiter;
set<int>::iterator isiter;
template <typename T>
struct SortDescending
{
    bool operator() (const T& lhs , const T& rhs) const
    {
        return (lhs > rhs);
    }
};
set <int, SortDescending<int> setIntegerS;
2. set插入元素
setlntegers.insert(1);
msetlntegers.insert (setlntegers.begin(), setlntegers.end());
3. set中查找元素
set<int> setone;
setone.insert(10);
setone.insert(13);
setone.insert(9); //9,10,13
auto isiter = setone.find(9);
if (ister != setlntegers.end())
    cout << "found" <<endl;
else
    cout << "not found"<<endl;
4. 删除set中的元素
setObject.erase(key);
setObject.erase(iElement);
setObject.erase(iLowerBound, iUpperBound);

八. STL映射类map

key(键)-- value(值)

1. 实例化map对象
map<key, value> mapone;

map<int, string> maptwo;
map<int, string> mapthree(maptwo);
map<int, string> mapfour(mapthree.begin(), mapthree.end())
2. map插入元素
map<int, string> mapone;
mapone.insert(make_pair(1, "one"));
mapone.insert(pair<int, string>(2, "two"))
mapone[3] = "three";
3.map查找元素
map<int, string> mapone;
map<int, string>::const_iterator isiter = mapone.find(1); //find(key)
if(isiter != mapone.end())
{
    cout<<"key: "<<isiter->first<<endl;
    cout<<"value: "<<isiter->second<<endl;
}
else
    cout<<"not found"<<endl;
4. map删除元素
mapObject.erase(key);
mapObject.erase(iElement);
mapObject.erase(iLowerBound, iUpperBound);
上一篇 下一篇

猜你喜欢

热点阅读