参看内容: VC知识库
算法部分主要由头文件
,
和
组成。
是所有STL头文件中最大的一个,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、反转、排序、合并等等。
体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。
中则定义了一些模板类,用以声明函数对象。
adjacent_find()( adjacent 是邻近的意思),binary_search(),count(),
count_if(),equal_range(),find(),find_if()。
merge(),sort(),random_shuffle()(shuffle是洗牌的意思) ,reverse()。
copy(), replace(),
replace_if(),swap()
accumulate()( accumulate 是求和的意思),fill(),。
set_union(),set_intersection(),
set_difference()。
for_each(), transform()( transform 是变换的意思)
例如:vecInt
是用vector
声明的容器,现已包含1,2,2,4,5元素。
vector
此时 *it == 2
注意:在无序序列中,不可使用。
例如: setInt
是用set
声明的容器,现已包含1,3,5,7,9元素。
bool bFind = binary_search(setInt.begin(),setInt.end(),5);
此时 bFind == true
例如:vecInt
是用vector
声明的容器,已包含1,3,5,7,9元素,现要求求出大于等于3的元素个数
//先定义比较函数
bool GreaterThree(int iNum)
{
if(iNum>=3)
{
return true;
}
else
{
return false;
}
}
int iCount = count_if(vecIntA.begin(), vecIntA.end(), GreaterThree);
//此时iCount == 4
iterator
,第一个表示
lower_bound
,第二个表示
upper_bound
。
例如: vecInt
是用vector
声明的容器,已包含1,3,5,7,9
vector
此时*it == 5
例如:vecInt
是用vector
声明的容器,已包含1,3,5,3,9元素。现要找出第一个大于等于3的元素的迭代器。
vector
此时 *it==3, *(it+1)==5, *(it+2)==3, *(it+3)==9
以下是排序和通用算法:提供元素排序策略
例如:vecIntA
,vecIntB
,vecIntC
是用vector
声明的容器,vecIntA
已包含1,3,5,7,9元素,vecIntB
已包含2,4,6,8元素
vecIntC.resize(9); //扩大容量
merge(vecIntA.begin(),vecIntA.end(),vecIntB.begin(),vecIntB.end(),vecIntC.begin());
此时vecIntC
就存放了按顺序的1,2,3,4,5,6,7,8,9九个元素
例如: vecInt
是用vector
声明的容器,已包含2,1,4,3,6,5元素
sort(vecInt.begin(),vecInt.end());
此时,vecInt包含了1,2,3,4,5,6元素。
如果vector
,T是自定义类型,则要提供T类型的比较函数。
学生类有学号跟姓名的属性,有一个存着学生对象的vector容器,要使该容器按学号升序排序。
//学生类
Class CStudent:
{
public:
CStudent(int iID, string strName) {m_iID=iID; m_strName=strName; }
int m_iID;
string m_strName;
}
//学号比较函数
bool Compare(const CStudent &stuA,const CStudent &stuB)
{
return (stuA.m_iID<strB.m_iID);
}
void main()
{
vector<CStudent> vecStu;
vecStu.push_back(CStudent(2,"老二"));
vecStu.push_back(CStudent(1,"老大"));
vecStu.push_back(CStudent(3,"老三"));
vecStu.push_back(CStudent(4,"老四"));
sort(vecStu.begin(),vecStu.end(),Compare);
// 此时,vecStu容器包含了按顺序的"老大对象","老二对象","老三对象","老四对象"
}
例如:vecIntA
,vecIntB
是用vector
声明的对象,vecIntA已包含1,3,5,7,9元素。
vecIntB.resize(5);
copy(vecIntA.begin(),vecIntA.end(),vecIntB.begin());
此时vecIntB
也包含了1,3,5,7,9元素
用法举例:
replace_if(vecIntA.begin(),vecIntA.end(),GreaterThree,newVal)
其中vecIntA
是用vector
声明的容器
GreaterThree
函数的原型是 bool GreaterThree(int iNum)