C++ STL vector map deque string 用法

编辑于 2017-01-30

* 移动设备下, 可左滑手指以查看较宽代码

记录下用法算了,可怕的 C++。

vector

// 可以使用数组来初始化vector对象
int arr[] = { 1,2,3,4,5,6 };
vector<int>v(begin(arr),end(arr));
// m*n的二维vector,注意两个 "> "之间要有空格
vector<vector <int> > ivec(m ,vector<int>(n)); 
// m*n的二维vector,所有元素初始化为0
vector<vector <int> > ivec(m ,vector<int>(n,0));
// 创建空容器,其对象类型为string类
vector<string> v1;         
// 创建有10个具有初始值(即空串)的string类对象的容器
vector<string> v2(10);    
// 创建有5个值为“hello”的string类对象的容器
vector<string> v3(5, "hello");
// v4是与v3相同的容器(完全复制)
vector<string> v4(v3.begin(), v3.end());  
// 删除指定位置
a.erase(a.begin()+2);
// 删除 [a.begin(), a.begin()+n)
a.erase(a.begin()+2, a.begin()+n);

注意,vector 迭代器删除:

// 正确方法
it = vector.erase(it);
// 如果是这样,因为是连续存放的,数组会前移,即迭代器跳到下一个,甚至越界
vector.erase(it);
it++;

map

插入或遍历

map<string,int>  m;
m["a"]=1;
m["b"]=2;
m["c"]=3;
map<string,int>::iterator it;
for(it=m.begin();it!=m.end();++it)
    cout<<"key: "<<it->first <<" value: "<<it->second<<endl;
return 0;

用 char* 作为 key,当传递一个常量字符串(例如"abc")进来时,可以通过 string 的构造函数自动将该常量字符串转换为一个 string 对象,而不是传入指针:

// 方法一
map<std::string, Actor> actorCache; 
// 方法二
struct ptrCmp {
    bool operator()( const char * s1, const char * s2 ) const {
        return strcmp( s1, s2 ) < 0;
    }
};
map<char *, int, ptrCmp> mapStr;

deque

入队,出队

deque<TreeNode*>a;
a.push_back(root);
a.front();
a.pop_front();

string

转 char *

char *res = new char[str.size()+1];
copy(str.begin(), str.end(), res);
res[str.size()]='\0';

string 数值转换:s=to_string(val); val = stoi(s, p, b); val可以是任何算术类型,对应stoi函数替换为stol、stod等,p表示字符串开始转换的下标,b表示转换所用基数

分割字符串:

char s[] = "  aa   bbb    ";
// *d 可以不是“ ”,可以是多个字符
const char *d = " ";
char *p;
p = strtok(s,d);
while(p) {
    printf("%s\n",p);
    p=strtok(NULL,d);
}

截取一段:

s2 = s1.substr(6, 6);