您的位置:首页 > 理论基础 > 数据结构算法

C++底层数据结构常用方法

2015-11-29 16:38 411 查看
set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。

平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。

构造set集合主要目的是为了快速检索,不可直接去修改键值。

常用操作:

1.元素插入:insert()

2.中序遍历:类似vector遍历(用迭代器)

3.反向遍历:利用反向迭代器reverse_iterator。

例:

set s;

......

set::reverse_iterator rit;

for(rit=s.rbegin();rit!=s.rend();rit++)

4.元素删除:与插入一样,可以高效的删除,并自动调整使红黑树平衡。

set s;

s.erase(2); //删除键值为2的元素

s.clear();

5.元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。

set s;

set::iterator it;

it=s.find(5); //查找键值为5的元素

if(it!=s.end()) //找到

cout<<*it<<endl;

else //未找到

cout<<"未找到";

6.自定义比较函数

(1)元素不是结构体:

例:

//自定义比较函数myComp,重载“()”操作符

struct myComp

{

bool operator()(const your_type &a,const your_type &b)

[

return a.data-b.data>0;

}

}

sets;

......

set::iterator it;

(2)如果元素是结构体,可以直接将比较函数写在结构体内。

例:

struct Info

{

string name;

float score;

//重载“<”操作符,自定义排序规则

bool operator < (const Info &a) const

{

//按score从大到小排列

return a.score

}

}

set s;

......

set::iterator it;

map篇

Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!

1. map最基本的构造函数;

mapmapstring; mapmapint;

mapmapstring; map< char,string>mapchar;

mapmapchar; mapmapint;

2. map添加数据;

map maplive;

1.maplive.insert(pair(102,"aclive"));

2.maplive.insert(map::value_type(321,"hai"));

3,maplive[112]="April";//map中最简单最常用的插入添加!

3,map中元素的查找:

find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。

map::iterator l_it;;

l_it=maplive.find(112);

if(l_it==maplive.end())

cout<<"we do notfind 112"<<endl;

else cout<<"wo find 112"<<endl;

4,map中元素的删除:

如果删除112;

map::iterator l_it;;

l_it=maplive.find(112);

if(l_it==maplive.end())

cout<<"we do not find 112"<<endl;

else maplive.erase(l_it); //delete 112;

5,map中 swap的用法:

Map中的swap不是一个容器中的元素交换,而是两个容器交换;

Forexample:

#include

#include

using namespace std;

intmain( )

{

map m1, m2, m3;

map ::iterator m1_Iter;

m1.insert ( pair ( 1, 10 ) );

m1.insert ( pair ( 2, 20 ) );

m1.insert ( pair ( 3, 30 ) );

m2.insert ( pair ( 10, 100 ) );

m2.insert ( pair ( 20, 200 ) );

m3.insert ( pair ( 30, 300 ) );

cout << "The original map m1 is:";

for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )

cout << " " << m1_Iter->second;

cout << "."<< endl;

//This is the member function version of swap

//m2 is said to be the argument map; m1 the target map

m1.swap( m2 );

cout << "After swapping with m2, map m1 is:";

for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )

cout << " " << m1_Iter -> second;

cout << "."<< endl;

cout << "After swapping with m2, map m2 is:";

for ( m1_Iter = m2.begin( ); m1_Iter != m2.end( ); m1_Iter++ )

cout << " " << m1_Iter -> second;

cout << "."<< endl;

//This is the specialized template version of swap

swap( m1, m3 );

cout << "After swapping with m3, map m1 is:";

for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )

cout << " " << m1_Iter -> second;

cout << "."<< endl;

}

6.map的sort问题:

Map中的元素是自动按key升序排序,所以不能对map用sort函数:

Forexample:

#include

#include

using namespace std;

intmain( )

{

map m1;

map ::iterator m1_Iter;

m1.insert ( pair ( 1, 20 ) );

m1.insert ( pair ( 4, 40 ) );

m1.insert ( pair ( 3, 60 ) );

m1.insert ( pair ( 2, 50 ) );

m1.insert ( pair ( 6, 40 ) );

m1.insert ( pair ( 7, 30 ) );

cout << "The original map m1 is:"<<endl;

for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )

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

}

Theoriginal map m1 is:

120

250

360

440

640

730

请按任意键继续. . .

7, map的基本操作函数:

C++ Maps是一种关联式容器,包含“关键字/值”对

begin() 返回指向map头部的迭代器

clear() 删除所有元素

count() 返回指定元素出现的次数

empty() 如果map为空则返回true

end() 返回指向map末尾的迭代器

equal_range() 返回特殊条目的迭代器对

erase() 删除一个元素

find() 查找一个元素

get_allocator() 返回map的配置器

insert() 插入元素

key_comp() 返回比较元素key的函数

lower_bound() 返回键值>=给定元素的第一个位置

max_size() 返回可以容纳的最大元素个数

rbegin() 返回一个指向map尾部的逆向迭代器

rend() 返回一个指向map头部的逆向迭代器

size() 返回map中元素的个数

swap() 交换两个map

upper_bound() 返回键值>给定元素的第一个位置

value_comp() 返回比较元素value的函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: