您的位置:首页 > 其它

STL几个(set map vector string)用法

2015-08-07 21:52 471 查看
string使用总结

1.初始化

string s0;

string s1("hello");

string s2(5, 'a'); //s2 = aaaaa;

string s3(s1); // s3 = hello

char str[100] = "aaaaabbbbbaaaaaaaaaaaaaaaaa";

string s4(str, 5); //s4 = aaaaa;

string s5(str+5, str+10); //s5 = bbbbb;

2.find函数

string s("bbabbabba"),s1("a");

s.find('a', pos = 0);

s.find(s1, pos = 0);

s.find("ab", pos = 0, num);

总结:

(1)find()返回一个size_type类型的数据,可以这样去判读是否找到:

basic_string<char>::size_type t = s.find(...);

if(t == string::npos) cout << "not find" << endl;

npos是string的一个静态成员变量,所以用string类名来修饰。

(2)第二个参数表示查找的起始位置,默认为0;

(3)如果是查找c类型的字符串还可以有第三个参数,表示要找这个字符串的前几个字符。

如(“absdfasdf”,5,2)表示,在原字符串的下表为5的位置开始找“ab”;

(4)具有相同语法的还有下面几个函数:

find_first_of(): 找第一次满足条件的位置

find_last_of(): 找最后一个满足条件的位置

find_first_not_of(): 找第一个不符合条件的位置

find_last_not_of():找最后一个不符合条件的位置

rfind(): 从后往前找

3.size_type capacity( ) const;

返回已经分配的存储空间大小。

4.length()和size()返回同样的值,都是string的大小。

length()是以前的string实现的函数。

size()是为了同STL融合,加入的函数。

5.substr(start = 0, num = npos);

返回string的一部分,有开始位置和个数,两个参数。

6.resize(num = 0, char = 0);

/*

string s("abcd");

s.resize(s.size()+2, '!'); //s = "abcd!!"

s.resize(s.size()+20); // s= "abcd",添加在后面的都是'/0'

s.resize(s.size()-2); // s = ab;

*/

7.assign()函数

s.assign(cstr, num = 0); //c_char*类型的从0开始拷贝num个进去。

s.assign(s2); //string类型的s2

s.assign(s2, start, num); // string类型的s2,从第start个位置开始,拷贝num个

s.assign(num, char); / / 拷贝num个char进去

s.assign(s2.begin(), s2.end() ); //迭代器版本

8.append()函数

同上!

10.swap(s2);

11.push_back(ch);

12.insert()函数

s1.insert(pos, *ptr);

s1.insert(pos, *ptr, num);

s1.insert(pos, s2);

s1.insert(pos, s2, start, num);

s1.insert(pos, num, ch); //在pos初加入num个char

s1.insert(iterator, s2.begin(), s2.end());

s1.insert(iterator, num, ch);

13.erase()函数

erase(s.begin(), s.end());

erase(iterator);

erase(pos = 0, num = npos); //默认全部删除

14.replace()函数

replace(pos, num, *ptr, num2 = npos); //用*ptr的num2个元素替换原string从pos开始的num个元素

replace(pos, num, s2, num2 = npos);

replace(pos, num, num2, ch); //原stringpos位置处的num个由num2个ch替换

replace(iter_first, iter_last, *ptr);

replace(iter_first, iter_last, s2);

replace(iter_first, iter_last, num2, ch);

replace(iter_first, iter_last, iter2_first, iter2_last,);

set的使用

#include <iostream>

#include <set>

#include <vector>

using namespace std;

int main()

{

vector<int> v;

for(int i = 0; i < 5; ++i)

v.push_back(i);

set<int> sett(v.begin(), v.end()); //可以用其他容器初始化set

set<int>::iterator iter, iter2;

sett.insert(8); //插入元素

iter = sett.find(2); //查看元素是否存在的方法一:find()

if(iter != sett.end())

cout << "ok, found it" << endl;

for(iter = sett.begin(); iter != sett.end(); ++iter)

cout << *iter << endl;

sett.erase(1); //删除元素

if(!sett.count(1)) //查看元素是否存在的方法二:count()

cout << "ok, Not found it" << endl;

iter2 = sett.upper_bound(4);

for(iter = sett.begin(); iter != iter2; ++iter)

cout << *iter << endl;

return 0;

}

注意事项:

1.当只想知道一个值是否存在时,使用set容器是最合适的。

2.正如不能修改map中元素的键部分一样,set中的键也为const。在获取指向set中某元素的迭代器后,只能对其做读操作,而不能做写操作

lower_bound()

Returns an iterator to the first element in a set with a key that is equal to or greater than a specified key.

upper_bound()

Returns an iterator to the first element in a set with a key that is greater than a specified key.

map的使用

#include <iostream>

#include <map>

#include <string>

using namespace std;

int main()

{

map<string, int> m;

map<string, int>::iterator iter;

typedef map<string, int>::value_type mType;

string s;

while(cin >> s)

m[s]++; //很重要的一种插入元素的方法,下标法

m.insert( make_pair("hello", 1) ); //另外两种插入元素的办法

m.insert( mType("world", 2) );

for(iter = m.begin(); iter != m.end(); ++iter)

cout << iter->first << " " << iter->second << endl; //读取元素的办法

iter = m.find("hello"); //查找元素的方法(1)find函数,注意检测的办法

if(iter != m.end())

cout << "yes, found it" << endl;

m.erase(iter); //删除元素的erase函数,还有第三个版本,参数是iterator的begin和end

m.erase("world");

if(m.count("world")) //查找元素的方法(2)cout函数,返回0或者1,表示有或无

cout << "error" << endl;

return 0;

}

注意事项:

使用下标访问map与使用下标访问数组或vector的行为截然不同:用下标访问不存在的元素将导致在map容器中添加一个新的元素,它的键即为该下标值。

multimap的使用

#include <iostream>

#include <map>

using namespace std;

int main()

{

typedef multimap<int, int> M;

M m;

multimap<int, int>::iterator iter;

typedef pair<int, int> Int_pair;

m.insert(Int_pair(3,3)); //插入一个元素的办法,不同于map

m.insert(Int_pair(4,4));

m.insert(Int_pair(3,4));

m.insert(Int_pair(2,2));

for(iter = m.begin(); iter != m.end(); iter++) //遍历multimap的方法,跟其他的容器一样

cout << iter->first << " " << iter->second << endl;

iter = m.find(2); //find返回的是第一个找到的元素的位置

if(iter == m.end()) cout << "can not find 2/n"; //注意判断没有找到的办法

else cout << iter->second << endl;

pair<M::iterator, M::iterator> range; //前面说了find只能返回第一个位置

range = m.equal_range(3); //要是想得到全部,只能这样啦。。。

for(iter = range.first; iter != range.second; iter++)

cout << iter->first << " " << iter->second << endl;

int num = m.count(3); //恩,返回满足条件的元素的个数,因为是multimap嘛。。。

cout << num << endl;

return 0;

}

还有几个函数也挺有用的,列在这里吧:

clear() :清空

empty(): 测试是否为空

erase(): 删除某个元素,或是某个区间内的元素

low_bound(); 比输入的元素小的第一个元素的iterator

upper_bound(): 比输入的元素大的第一个元素的iterator

也支持rbegin()和rend()函数

vector实现多维数组

#include <iostream>

#include <vector>

using namespace std;

vector< vector<int> >m (3, vector<int>(5));

int main()

{

for(int i = 0; i < m.size(); i++)

{

for(int j = 0; j < m[i].size(); j++)

cout << m[i][j] << "/t";

cout << endl;

}

return 0;

}

vector的构造函数中,有下面的形式:

vector(

size_type _Count,

const Type& _Val

);

采用这种形式,可以实现,每维数组大小不同。可以重新确定每维数组的大小:

void reshape_m(int ns)

{

for(int i = 0; i < m.size(); i++)

m[i].resize(ns);

}

所有的sort算法的参数都需要输入一 个范围,[begin, end)。这里使用的迭代器(iterator)都需是随机迭代器(RadomAccessIterator)

以下是所有STL sort算法函数的名字列表:

函数名

功能描述

sort

对给定区间所有元素进行排序

stable_sort

对给定区间所有元素进行稳定排序

partial_sort

对给定区间所有元素部分排序

partial_sort_copy

对给定区间复制并排序

nth_element

找出给定区间的某个位置对应的元素

is_sorted

判断一个区间是否已经排好序

partition

使得符合某个条件的元素放在前面

注意最后一个,符合条件的是放在前半部分的。可以用splice提取想要的部分。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: