- 浏览: 516621 次
- 性别:
- 来自: 惠州
文章分类
- 全部博客 (255)
- ant (1)
- springMVC (2)
- ajax (4)
- oracle (12)
- SSH (13)
- struts1 (2)
- Hibernate (14)
- spring (5)
- jstl (1)
- 连接池 (1)
- acegi (4)
- java (17)
- jquery (11)
- div+css (4)
- drupal (1)
- php (8)
- freemaker调模板生成静态页面 (1)
- xml (1)
- json (2)
- javascript (9)
- 正则表达式 (4)
- Ext (8)
- jdbc (1)
- sql server (2)
- perl (5)
- db4o (1)
- webservice (4)
- flex (13)
- it资讯 (1)
- joomla (0)
- 设计模式 (1)
- struts2 (4)
- s2sh (8)
- linux (3)
- ejb (2)
- android旅途 (24)
- android (36)
- C/C++ (16)
- mysql (1)
最新评论
-
fengyuxing168:
IBelyService bs = IBelyService. ...
为 Android 添加 Java 层服务也就是添加自定义的aidl服务到serviceManager 通过ServiceManager.getService取 -
dengzhangtao:
"由于ActivityManagerService是 ...
binder理解 -
yzyspy:
ActivityManagerService:startHom ...
Android的Launcher成为系统中第一个启动的,也是唯一的 -
Matchstick:
使用SELECT DISTINCT alias FROM Po ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题 -
dlheart:
没看懂你什么意思啊,我遇到的问题是一对多,设了fetch = ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题
STL 中的" 集合类" 的定义使用
#include <set>
#include <iostream>
using namespace std;
typedef set <double, less <double> , allocator
<double> > set_type;
ostream& operator < <(ostream& out, const
set_type& s)
{
copy(s.begin(), s.end(),ostream_iterator
<set_type::value_type,char> (cout, " "));
return out;
}
int main(void)
{
// create a set of doubles
set_type sd;
int i;
for (i = 0; i < 10; ++i)
{
// insert values
sd.insert(i);
}
// print out the set
cout < < sd < < endl < <
endl;
// now let’s erase half of the
elements in the set
int half = sd.size() > > 1;
set_type::iterator sdi = sd.begin();
advance(sdi,half);
sd.erase(sd.begin(),sdi);
// print it out again
cout < < sd < < endl < <
endl;
// Make another set and an empty
result set
set_type sd2, sdResult;
for (i = 1; i < 9; i++)
sd2.insert(i+5);
cout < < sd2 < < endl;
// Try a couple of set algorithms
set_union(sd.begin(),sd.end(),sd2.begin(),sd2.end(),
inserter(sdResult,sdResult.begin()));
cout < < "Union: " < < endl
< < sdResult < < endl;
sdResult.erase(sdResult.begin(),sdResult.end());
set_intersection(sd.begin(),sd.end(),
sd2.begin(),sd2.end(),
inserter(sdResult,sdResult.begin()));
cout < < "Intersection: " < <
endl < < sdResult < < endl;
return 0;
}
Program Output
0 1 2 3 4 5 6 7 8
9
5 6 7 8 9
6 7 8 9 10 11 12 13
Union:
5 6 7 8 9 10 11 12 13
Intersection:
6 7 8 9
#include <iostream>
#include <set>
using namespace std;
int main(int argc, char* argv[])
{
set <int>
myset;
for(int i=1;i
<=10;i++)
myset.insert(i);
set <int>
::iterator it;
for(it=myset.begin();it!=myset.end();++it)
cout < <*it;
return 0;
}
C++ Sets(集合)
set和map一样属于关联容器,set是集合,map是映射。若元素类型为int,double,string就会自动进行(默认是升序)排序(使用平衡二叉树来实现),使用自定义类型而未定义比较运算符就不能自动排序了。set容器不支持随机访问。
函数列表:
begin()返回指向第一个元素的迭代器
clear()清除所有元素
count()返回某个值元素的个数
empty()如果集合为空,返回true
end()返回指向最后一个元素的迭代器
equal_range()返回集合中与给定值相等的上下限的两个迭代器
erase()删除集合中的元素
find()返回一个指向被查找到元素的迭代器
get_allocator()返回集合的分配器
insert()在集合中插入元素
lower_bound()返回指向大于(或等于)某值的第一个元素的迭代器
key_comp()返回一个用于元素间值比较的函数
max_size()返回集合能容纳的元素的最大限值
rbegin()返回指向集合中最后一个元素的反向迭代器
rend()返回指向集合中第一个元素的反向迭代器
size()集合中元素的数目
swap()交换两个集合变量
upper_bound()返回大于某个值元素的迭代器
value_comp()返回一个用于比较元素间的值的函数
////////////////////////////////////////////////////////////////////////////////////
构造函数
explicit set(const Pred& comp = Pred(), const A& al = A());
set(const set& x);
set(const value_type *first, const value_type *last,
const Pred& comp = Pred(), const A& al = A());
实际中可能使用的形式:
1.set c 定一一个空的set对象。
2.set c(op) 定一一个空的set对象,指定排序规则。
3.set c(set& other) 定义一个set对象,拷贝所有的other元素到c中。
4.set c(begin, end, op) 定义一个set对象,拷贝所有的从begin到end的元素到c中,并指定op进行排队。
5.set c(begin, end) 定义一个set对应,初始化c从begin到end。
begin
语法:
iterator begin();
返回指向当前集合中第一个元素的迭代器。
clear
语法:
void clear();
清除当前集合中的所有元素。
count
语法:
size_type count( const key_type &key );
返回当前集合中出现的某个值的元素的数目。
empty
语法:
bool empty();
如果当前集合为空,返回true;否则返回false。
end
语法:
const_iterator end();
返回指向当前集合中最后一个元素的迭代器。
equal_range
语法:
pair equal_range( const key_type &key );
返回集合中与给定值相等的上下限的两个迭代器。
erase
语法:
void erase( iterator i );
void erase( iterator start, iterator end );
size_type erase( const key_type &key );
说明:
1. 删除i元素;
2. 删除从start开始到end结束的元素;
3. 删除等于key值的所有元素(返回被删除的元素的个数)。
find
语法:
iterator find( const key_type &key );
在当前集合中查找等于key值的元素,并返回指向该元素的迭代器。如果没有找到,则返回end()。
get_allocator
语法:
allocator_type get_allocator();
返回当前集合的分配器。
insert
语法:
iterator insert( iterator i, const TYPE &val );
void insert( input_iterator start, input_iterator end );
pair insert( const TYPE &val );
说明:
1. 在迭代器i前插入val;
2. 将迭代器start开始到end结束返回内的元素插入到集合中;
3. 在当前集合中插入val元素,并返回指向该元素的迭代器和一个布尔值来说明val是否成功的被插入了。(应该注意的是在集合(Sets)中不能插入两个相同的元素。)
示例:
#include <iostream>
#include <set>
#include<string>
using namespace std;
typedef struct tagStudentInfo
{
int nID;
string strName;
bool operator <(tagStudentInfo const& _A) const//升序排列
{
//这个函数指定排序策略,按nID排序,如果nID相等的话,按strName排序
if(nID<_A.nID) return true;
if(nID == _A.nID) return strName.compare(_A.strName) < 0;
return false;
}
}StudentInfo,*PStudentInfo; //学生信息
void main()
{
set<StudentInfo>setStudent;
StudentInfo stuInfo;
stuInfo.nID = 1;
stuInfo.strName="student_one";
pair<set<StudentInfo>::iterator,bool>set_ptr;
set_ptr=setStudent.insert(stuInfo);
stuInfo.nID=1;
stuInfo.strName="student_one";
set_ptr=setStudent.insert(stuInfo);
if(!set_ptr.second){ cout<<"don`t insert!"<<endl; }
stuInfo.nID=2;
stuInfo.strName="student_two";
set_ptr=setStudent.insert(stuInfo);
if(!set_ptr.second){ cout<<"don`t insert 2!"<<endl; }
set<StudentInfo>::iterator p=setStudent.begin();
for(p;p!=setStudent.end();p++)
{
cout<<(*p).nID<<" "<<(*p).strName<<endl;
}
}
输出结果:
don`t insert!
1 student_one
2 student_two
lower_bound
语法:
iterator lower_bound( const key_type &key );
返回一个指向小于或者等于key值的第一个元素的迭代器
key_comp
语法:
key_compare key_comp();
返回一个用于元素间值比较的函数对象。
max_size
语法:
size_type max_size();
返回当前集合能容纳元素的最大限值。
rbegin
语法:
reverse_iterator rbegin();
返回指向当前集合中最后一个元素的反向迭代器。
rend
语法:
reverse_iterator rend();
返回指向集合中第一个元素的反向迭代器。
size
语法:
size_type size();
返回当前集合中元素的数目。
swap
语法:
void swap( set &object );
交换当前集合和object集合中的元素。
upper_bound
语法:
iterator upper_bound( const key_type &key );
在当前集合中返回一个指向大于Key值的元素的迭代器。
value_comp
语法:
value_compare value_comp();
返回一个用于比较元素间的值的函数对象。
set的集合功能(须#include<algorithm>):
1.两个有序集的并.
set_union(s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(s,s.begin()));
三个set对象,分别为s1,s2,s.set_union的功能是将s1的某个序列(比如[s1.begin(),s1.end()))与s2的某个序列(比如[s2.begin(),s2.end()))合并,然后把合并序列插入到s中。
2.两个有序集的交.
set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(s,s.begin()));
3.两个有序集的差.
set_difference (s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(s,s.begin()));
发表评论
-
Linux内存点滴 用户进程内存空间 stack heap text data
2013-01-19 16:54 2967Linux内存点滴 用户进程内存空间 经常使用top ... -
Java JNI由浅入深(包括:Java和C++互传ArrayList泛型对象参数)
2011-10-28 15:09 4196Java JNI由浅入深(包括:Java和C++互传Array ... -
JNI编程(二) —— 让C++和Java相互调用(1)
2011-10-28 11:55 939自己在外面偷偷的算了下,又有将近两个月没更新过blog了。趁着 ... -
Android jni 常用方法备忘
2011-10-28 10:44 1206Android jni 常用方法备忘 ... -
c 线程同步
2011-10-28 09:23 904#include <pthread.h> #inc ... -
c++ 双线程协议解析 链表 sleep pthread_join g++编译
2011-10-25 11:37 1726主类 testlinklist.cpp #include &l ... -
undefined reference to 'pthread_create'问题解决
2011-10-25 10:19 1299undefined reference to 'pthread ... -
strlen与sizeof的区别
2011-10-12 14:20 853strlen与sizeof的区别 最后一个int a[3 ... -
C/C++语言数组作为参数传递
2011-09-28 17:08 1319#include <stdio.h> #inclu ... -
c/c++字符函数操作
2011-09-20 17:01 857// 取得Xml元素的值 // itemName:元 ... -
C++——指针,堆栈,引用,函数
2011-09-16 14:07 1376C++——指针,堆栈,引用,函数 ... -
今天看了两个小时<<21天学通C++>>把C++中的指针、引用、传值问题弄清楚了
2011-09-16 11:13 1075今天看了两个小时 <<21 天学通 C+ ... -
c++链表操作
2011-09-15 19:22 925最后我学习一下如何在已有的链表上插入节点 我们要考虑四 ... -
c++面向对象的编程入门篇--类构造函数与析构函数
2011-09-15 16:14 985请注意,这一节内容是c++的重点,要特别注意! 我们先说一 ... -
C++实例集合类
2011-09-13 11:04 1299// 此程序通过数组来定义集合类,虽不如链表高级, ... -
C++操作符含义
2011-01-20 10:44 2138C++操作符含义 "->"是 ...
相关推荐
STL(Standard Template Library)是一种强大的C++库,提供了大量的模板类和函数,可以在OOP和常规编程中使用。STL的主要特点是数据结构和算法的分离,使得它具有广泛的通用性。 STL的特点: 1. 数据结构和算法的...
这意味着你定义一次算法或容器,就可以应用于整数、浮点数、自定义类等不同类型的数据。 在学习STL时,掌握其设计理念、工作原理和使用方法至关重要。实践是检验理解的最好方式,尝试编写使用STL的代码,解决实际...
总的来说,这个C语言版的STL集合库是为了弥补C语言在数据结构和算法库上的不足,让开发者能够在C项目中享受到类似C++ STL的便利。它可能并不具备C++ STL的所有功能,但至少提供了基础的数据结构和算法,使得代码的...
3. 算法:STL包含了一系列预定义的算法,如排序(sort)、查找(find)、合并(merge)等。这些算法可以应用于各种容器,提高了代码的复用性和效率。 4. 函数对象(或适配器):函数对象是能够像普通函数那样使用的...
- 举例说明如何自定义一个函数对象,并在STL算法中使用。 - 描述STL容器的内存管理和效率特点,比如vector的连续存储和list的跳跃访问。 4. **STL.doc** 另一份全面的STL文档可能详细解释了各个组件的内部工作...
1. 容器:STL提供了一组预先定义好的容器类,如vector(动态数组)、list(双向链表)、deque(双端队列)、set(集合)、map(映射)等。这些容器可以存储不同类型的数据,并提供了各种操作,如插入、删除、遍历等...
通过以上介绍,我们可以看到C++ STL集合(set)是一个强大且灵活的数据结构,适用于需要快速查找、排序且不允许重复元素的场景。通过红黑树的内部实现,集合提供了高效的操作性能,使得它成为C++程序员的常用工具之...
在实际编程中,STL的使用能显著提升代码的效率,因为它内部的实现通常比手动编写代码更优化。例如,`vector`的插入和删除操作在大多数情况下比原始数组更快,因为它会自动处理内存管理和元素移动。 STL的文档详细...
任何满足标准中定义的需求集合的类都可以被称为`Allocator`。`std::allocator`是标准库中唯一预定义的`Allocator`类。 - **通用需求集**:这部分在标准文档§20.1.5(表32)中进行了描述,规定了`Allocator`应该具备...
2. **标准模板**:在C++ STL中,模板被用来定义泛型类(如容器和迭代器)和泛型函数(如算法)。例如,`vector`、`list`、`map`等都是标准模板类,它们可以存储不同类型的数据。模板使代码更加模块化,易于维护和...
一旦我们解析了STL文件,我们就可以将这些顶点转换为`MeshGeometry3D`对象,它是WPF中表示3D几何的基本类。 以下是实现步骤的概述: 1. 引入必要的命名空间:为了处理3D图形,我们需要引入`System.Windows.Media....
STL包含了一系列容器类,如vector(动态数组)、list(双向链表)、deque(双端队列)、set(红黑树实现的集合)、map(键值对映射)等。这些容器可以存储不同类型的数据,并提供了方便的插入、删除和访问操作。 2...
在STL中,容器是存储元素的类模板,如vector用于动态数组,list用于双向链表,set用于有序集合。这些容器提供了插入、删除、遍历元素的方法。迭代器是访问容器中元素的接口,类似于指针,但提供了更多的安全性和便利...
`functional`:这个文件包含了函数对象(functors)和函数适配器,如`std::bind`和`std::mem_fn`,它们可以用来封装函数和成员函数,方便在算法中使用。 `type_traits.h`:类型 traits 是 C++11 引入的工具,用于在...
此外,STL还包括了算法的辅助类,如pair(用于存储两个值)、allocator(内存分配器)等。allocator允许你自定义内存管理策略,以适应不同场景的需求。 在学习STL的过程中,你需要掌握以下要点: 1. 理解容器的...
标准模板库(Standard Template Library,STL)是C++编程语言中的一个重要组成部分,它提供了一组高效、可重用的数据结构和算法。STL的出现极大地提高了C++程序员的开发效率,让代码更加简洁且易于维护。在STL中,...
STL文件教学可能涵盖如何创建、编辑、查看和转换STL文件,以及如何在C++编程中使用STL库进行3D模型的处理。 在提供的"STL.ppt"幻灯片教学中,可能涉及以下内容: 1. STL库的介绍,包括其历史和设计目标。 2. 如何在...
为了在 `set` 或 `map` 中使用类作为key,我们需要定义一个类,并为其提供必要的成员函数。通常,这包括: - **构造函数**: 初始化对象。 - **析构函数**: 清理资源。 - **赋值运算符**: 实现对象间的赋值操作。 - *...
在本文档中,我们将深入理解STL的核心概念,帮助你在三十分钟内建立起对STL的基本认知。 首先,STL的一个关键特性是数据结构和算法的分离。这意味着,比如`sort()`函数,可以应用于多种数据集合,如链表、容器和...