RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++之STL算法(1)

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2023-07-18 14:30 ? 次閱讀

STL容器算法主要有:、、組成

algorithm主要有遍歷、比較、交換、查找、拷貝、修改等;

numeric體積很小,主要包括幾個序列上的進行數(shù)學運算的函數(shù)模板;

functional定義了一些模板類,用于聲明仿函數(shù);

1.遍歷容器for_each

for_each()函數(shù)用于完成容器遍歷,函數(shù)參數(shù)如下:

for_each(_InIt _First, _InIt _Last, _Fn _Func)
形參:_First、_Last --容器的起始和結束迭代器
     _Func -->仿函數(shù)(回調函數(shù)),處理要輸出的信息

1.1 vector容器遍歷

自定義數(shù)據(jù)格式:

class Person
{
	friend class mycompare;
	friend class Myprint;//友元類
	friend void Print(const Person& p);//友元函數(shù)
public:
	Person() {}
	Person(string name, int age) :name(name), age(age) {

	}
	Person(const Person& p)
	{
		name = p.name;
		age = p.age;
	}
	bool operatorage == p.age)
		{
			return p.name < p.name;
		}
		return this-?>age > p.age;
	}
private:
	string name;
	int age;
};
//創(chuàng)建函數(shù)對象
class Myprint
{
public:
	void operator()(const Person& p)
	{
		cout & p)
	{
		cout 單端數(shù)組
	vectorvtr;
	vtr.push_back(Person("小王", 18));
	vtr.push_back(Person("小林", 18));
	vtr.push_back(Person("小李", 18));
	vtr.push_back(Person("小劉", 18));
	cout 

1.2 list容器遍歷

void list_test()
{
	//創(chuàng)建一個list容器-->雙向鏈表
	cout  t;
	t.push_back(Person("小王", 18));//尾插
	t.push_front(Person("小林", 18));//頭插
	t.push_back(Person("小李", 18));
	t.push_back(Person("小劉", 18));
	cout 

1.3 set容器遍歷

void set_test()
{
	cout mt;//該容器會自動排序
	mt.insert(Person("小王", 18));
	mt.insert(Person("小林", 18));
	mt.insert(Person("小李", 17));
	mt.insert(Person("小劉", 18));
	mt.insert(Person("小李", 22));
	for_each(mt.begin(), mt.end(), Myprint());

	cout mt2;
	mt2.insert(Person("小王", 18));
	mt2.insert(Person("小林", 18));
	mt2.insert(Person("小李", 17));
	mt2.insert(Person("小劉", 18));
	mt2.insert(Person("小李", 22));
	for_each(mt.begin(), mt.end(), Myprint());
}

1.4 map容器遍歷

void map_test()
{
	cout mp;
	mp.insert(make_pair(Person("小王", 18), 88));
	mp.insert(pair(Person("小林", 18),99));
	mp.insert(pair(Person("小李", 17), 95));
	mp.insert(pair(Person("小劉", 18), 95));
	mp.insert(pair(Person("小李", 22), 90));
	for_each(mp.begin(), mp.end(), Myprint());
}

1.5 整體運行效果

int main()
{
	vector_test();//vector容器
	list_test();//list容器
	set_test();//set容器
	map_test();//map容器
	system("pause");
}
wKgZomS2LC2AfcZSAAZalV2pm3Q837.png

2.轉移元素transform

transform函數(shù):
	transform(const _InIt _First, const _InIt _Last, _OutIt _Dest, _Fn _Func)
	將一個函數(shù)中的元素拷貝到另一個容器中,
	_First、_Last --要轉移的容器的起始迭代器和結束迭代器
	_Dest --目標容器的起始迭代器
	_Func --仿函數(shù),支持一元運算,可以對當前值進行+ - *  等各種運算

使用示例:

#include 
using namespace std;
#include 
#include 
class myprint
{
public:
	void operator()(int val)
	{
		cout t1;
	for (int i = 0; i < 10; i++)
	{
		int temp = rand() % 101;
		t1.push_back(temp);
	}
	cout target;
	target.resize(t1.size());//設置target容器大小
	transform(t1.begin(), t1.end(), target.begin(), myfunc());
	cout 
wKgaomS2LMOALDr6AAQ4-ewgtdg545.png

3.成員查找


STL中支持多種查找方式。

  • find() --查找指定元素
  • find_if() --按條件查找
  • adjacend_find() --查找相鄰元素
  • binary_search() --二分法查找
  • count() --統(tǒng)計元素個數(shù)
  • count_if() --按條件統(tǒng)計

3.1 find查找

find函數(shù):
find(_InIt _First, const _InIt _Last, const _Ty& _Val);
   _First、_Last  --查找的起始和結束位置
   _Val  --要查找的內容
返回值:成功返回查找到位置的迭代器
        失敗返回end();
#include 
using namespace std;
#include 
#include 
#include 
#include 
#include 
class Person
{
	friend class map_compare;
	friend class print;
	friend ostream& operator p.age;
	}
private:
	string name;
	int age;
};
ostream& operatorvtr;
	vtr.push_back(Person("小王", 18));
	vtr.push_back(Person("小劉", 17));
	vtr.push_back(Person("小李", 22));
	vtr.push_back(Person("小林", 19));
	for_each(vtr.begin(),vtr.end(),print());
	vector::iterator ret=find(vtr.begin(), vtr.end(), Person("小劉", 17));
	if (ret == vtr.end())
	{
		cout t;
	t.push_back(Person("小王", 18));
	t.push_front(Person("小劉", 17));
	t.insert(t.end(),Person("小王", 18));
	t.insert(t.begin(), Person("小王", 18));
	t.push_back(Person("小李", 22));
	t.push_back(Person("小林", 19));
	for_each(t.begin(), t.end(), print());
	cout ::iterator ptr = t.begin();ptr != t.end(); )
	{
		ptr =find(ptr, t.end(), Person("小王", 18));
		if (ptr != t.end())
		{
			cout s;
	s.push(Person("小王", 18));
	s.push(Person("小劉", 17));
	s.push(Person("小李", 22));
	s.push(Person("小林", 19));
	s.push(Person("小王", 18));
	cout & p)
	{
		cout & p1, const pair& p2)
	{
		if (p1.first == p2.first && p1.second == p2.second)return true;
		return false;
	}

};
//map容器
void multimap_test()
{
	cout mp;
	//插入數(shù)據(jù)
	mp.insert(pair(Person("小王", 18), 88));
	mp.insert(make_pair(Person("小劉", 17), 99));
	mp.insert(multimap::value_type(Person("小王", 18), 100));
	mp.insert(make_pair(Person("小李", 19), 95));
	for_each(mp.begin(), mp.end(), map_print());
	cout::iterator ret = mp.find(Person("小王", 18));//查找數(shù)據(jù)
	map_print p;
	//multimap容器由于數(shù)據(jù)都是有序的,所以相同的數(shù)據(jù)都是連在一起的
	for (int i = 0; i < mp.count(Person("小王", 18)); i++, ret++)
	{
		if (ret != mp.end())
		{
			p(*ret);
		}
	}
}
class stu
{
public:
	stu() {}
	stu(string name, int age) :name(name), age(age) {
	}
	bool operator==(const stu& p)const
	{
		if (name == p.name && age == p.age)return true;
		return false;
	}
	bool operator p.age;
	}
	string name;
	int age;
};
int main()
{
	vec_test();
	list_test();
	stack_test();
	multimap_test();
	system("pause");
}
#endif
wKgaomS2LUGAFDFpAAXCPr3eYyg403.png

3.2 find_if條件查找

find_if(_InIt _First, const _InIt _Last, _Pr _Pred)
形參:_First、_Last --查找的起始和結束迭代器
	 _Pred  --仿函數(shù),查找條件
返回值:成功返回查找到的成員的位置迭代器
        失敗返回endl
#include 
#include 
#include 
#include 
#include 
using namespace std;
class Person
{
	friend std::ostream& operator(const Person& p)const
	{
		return age > p.age;
	}
private:
	std::string name;
	int age;
};
std::ostream& operator 18;
	}
	bool operator()(const Person& p1, const Person& p2)const
	{
		if (p1.age == p2.age)return p1.name < p2.name;
		return p1.age < p2.age;
	}

};
class print
{
public:
	void operator()(pairp)
	{
		cout  vtr;
	vtr.push_back(Person("小王", 18));
	vtr.push_back(Person("小劉", 17));
	vtr.push_back(Person("小李", 22));
	vtr.push_back(Person("小林", 19));
	std::cout ::iterator ret=find_if(vtr.begin(), vtr.end(), compare());
	if (ret != vtr.end())
	{
		std::cout p;
	p.insert(make_pair(Person("小王", 18), 88));
	p.insert(make_pair(Person("小劉", 17), 99));
	p.insert(make_pair(Person("小劉", 17), 77));
	p.insert(make_pair(Person("小林", 17), 77));
	p.insert(make_pair(Person("小李", 22), 100));
	for_each(p.begin(), p.end(), print());
	cout ::iterator,multimap::iterator> ret=p.equal_range(Person("小劉", 17));
	for (; ret.first != ret.second;ret.first++)
	{
		print temp;
		temp(*(ret.first));
	}
}
int main()
{
	vector_test();
	multimap_test();
	system("pause");
}
wKgaomS2LjOALxFYAATqzOaazhc122.png

3.3 find_if條件查找

adjacent_find() -查找相鄰重復元素,查找成功返回相鄰重復元素的首位置的迭代器,失敗返回end
iterator adjacent_find(const _FwdIt _First, _FwdIt _Last, _Pr _Pred)
形參:_First、_Last --要查找的起始、結束區(qū)間迭代器
      _Pred --查找條件
返回值:成功返回相鄰重復元素的首位置的迭代器
        失敗返回end

示例:

#include 
#include 
#include 
#include 
using namespace std;
class Person
{
	friend ostream& operatorage && p.name == name)return true;
		return false;
	}
	string name;
	int age;
};
ostream& operatorvtr;
	vtr.push_back(Person("小王", 18));
	vtr.push_back(Person("小劉", 18));
	vtr.push_back(Person("小王", 18));
	vtr.push_back(Person("小王", 18));
	vtr.push_back(Person("小李", 18));
	auto ret=adjacent_find(vtr.begin(), vtr.end(), compare());
	if (ret != vtr.end())
	{
		cout  p)const
	{
		cout  17;
	}

};
void mulitmap_test()
{
	cout mp;
	mp.insert(make_pair(Person("小王", 16), 77));
	mp.insert(make_pair(Person("小劉", 18), 88));
	mp.insert(make_pair(Person("小劉", 18), 88));
	mp.insert(make_pair(Person("小李", 19), 99));
	cout 

wKgZomS2LwSAQSh9AAWEAOiUcQk947.png

3.4 二分法查找binary_search

二分法查找元素:
	bool binary_search(val); -->查找成功返回true,失敗返回false,保證數(shù)據(jù)順序為從小到大
	binary_search(_FwdIt _First, _FwdIt _Last, const _Ty& _Val, _Pr _Pred)
	形參:_First、_Last --起始和結束迭代器
	      _Val --要查找的內容
		  _Pred  --數(shù)據(jù)順序方式(默認從小到大)
注意:調用該函數(shù)必須保證有序,否結果可能不準確
#include 
#include 
#include 
#include 
using namespace std;
class Print
{
public:
	void operator()(int v1)
	{
		cout vtr;
	vtr.push_back(10);
	vtr.push_back(3);
	vtr.push_back(6);
	vtr.push_back(2);
	vtr.push_back(5);
	cout ());
	for_each(vtr.begin(), vtr.end(), Print());
	cout 
wKgZomS2MAuAaH3uAANuZISEEjA633.png

3.5 查找個數(shù)count

查找指定成員個數(shù):
	count(const _InIt _First, const _InIt _Last, const _Ty& _Val)-->返回查找到的個數(shù)
	形參:_First、_Last --起始和結束迭代器
	      _Val --要查找的內容
	返回值:返回查找到的個數(shù)

示例:

#include 
using namespace std;
#include 
#include 
class Person
{
public:
	Person() {}
	Person(string name, int age) :name(name), age(age) {

	}
	bool operator==(const Person p)const
	{
		if (age == p.age && name == p.name)return true;
		return false;
	}
	bool operator==(const int age)const
	{
		if (this->age == age)return true;
		return false;
	}
	string name;
	int age;
};
class compare
{
public:
	bool operator()(const Person p1, const Person p2)const
	{
		if (p1.age == p2.age && p1.name == p2.name)return true;
		return false;
	}
};
void test()
{
	vector vtr;
	vtr.push_back(Person("小王", 18));
	vtr.push_back(Person("小劉", 22));
	vtr.push_back(Person("小王", 18));
	vtr.push_back(Person("小林", 17));
	vtr.push_back(Person("小王", 18));
	vtr.push_back(Person("小蔣", 20));
	auto cnt=count(vtr.begin(), vtr.end(), Person("小王", 18));
	cout 
wKgaomS2MK-ADoVZAARGnxdwobM467.png

3.5 查找個數(shù)count

按條件查找:
	count_if(_InIt _First, _InIt _Last, _Pr _Pred);--返回查找到個數(shù)
	形參:_First、_Last --起始和結束迭代器
	      _Pred  --查找條件
	返回值:返回查找到的元素位置的迭代器
	        失敗返回end()
#include 
#include 
#include 
using namespace std;
class Person
{
public:
	Person() {}
	Person(string name, int age) :name(name), age(age) {

	}
	string name;
	int age;
};
class Compare
{
public:
	bool operator()(const Person& p)const
	{
		if (p.name == "小王" && p.age > 18)return true;
		return false;
	}

};
void test()
{
	vectorvtr;
	vtr.push_back(Person("小王", 18));
	vtr.push_back(Person("小劉", 22));
	vtr.push_back(Person("小王", 19));
	vtr.push_back(Person("小林", 17));
	vtr.push_back(Person("小王", 22));
	vtr.push_back(Person("小蔣", 20));
	auto ret=count_if(vtr.begin(), vtr.end(), Compare());
	cout 
wKgZomS2MUyAT0dCAAQOOcbjHy0770.png
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4607

    瀏覽量

    92826
  • 函數(shù)
    +關注

    關注

    3

    文章

    4327

    瀏覽量

    62567
  • 容器
    +關注

    關注

    0

    文章

    495

    瀏覽量

    22060
  • C++
    C++
    +關注

    關注

    22

    文章

    2108

    瀏覽量

    73617
  • STL
    STL
    +關注

    關注

    0

    文章

    86

    瀏覽量

    18319
收藏 人收藏

    評論

    相關推薦

    c語言入門知識STL

    這周終于可以給大家把STL方面的面試題總結出來了,突然發(fā)現(xiàn)它里面的細節(jié)非常多,只有你想不到的,沒有它沒有的。對于C++程序員來說,STL庫里面的知識也是非常重要的,只要想在技術這條路線上有長遠的發(fā)展,那么就一定要掌握它。不管是學
    的頭像 發(fā)表于 03-10 09:31 ?1117次閱讀

    C++STL算法(二)

    C++STL算法(二)
    的頭像 發(fā)表于 07-18 14:49 ?1033次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b><b class='flag-5'>STL</b><b class='flag-5'>算法</b>(二)

    c++STL算法(三)

    c++STL算法(三)
    的頭像 發(fā)表于 07-18 15:00 ?1277次閱讀
    <b class='flag-5'>c++</b><b class='flag-5'>之</b><b class='flag-5'>STL</b><b class='flag-5'>算法</b>(三)

    C++文件操作

    C++文件操作
    的頭像 發(fā)表于 07-21 10:52 ?1107次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>文件操作

    C++ STL的概念及舉例

      本篇文章是作者本人使用STL 后的一些看法, 對於想要靠此文章學習STL, 是不可能的. 建議叁后面介紹的一些書入門.   STL的概念   在STL 中, 大至上分三個主要的
    發(fā)表于 08-30 11:39 ?1410次閱讀

    STL算法在GIS中的應用

    使用STL 算法實現(xiàn)GIS 算法可以保證它的簡潔和高效該文結合C++代碼實例抽象出了地理算子的概念應用在GIS 算法當中通過定制適配器來消除
    發(fā)表于 06-28 16:55 ?33次下載

    C++課程資料詳細資料合集包括了:面向對象程序設計與C++,算法,函數(shù)等

    本文檔的主要內容詳細介紹的是C++課程資料資料合集包括了:面向對象程序設計與C++,算法,函數(shù),概述, C++語言基礎,構造數(shù)據(jù)類型,數(shù)據(jù)類型,C+
    發(fā)表于 07-09 08:00 ?18次下載
    <b class='flag-5'>C++</b>課程資料詳細資料合集包括了:面向對象程序設計與<b class='flag-5'>C++</b>,<b class='flag-5'>算法</b>,函數(shù)等

    C++程序設計教程之性能的詳細資料課件說明

    本文檔的詳細介紹的是C++程序設計教程之性能的詳細資料課件說明主要內容包括了: 1. 內聯(lián)函數(shù) ( Inline Functions ),  2.數(shù)據(jù)結構 ( Data Structures
    發(fā)表于 02-21 17:19 ?2次下載
    <b class='flag-5'>C++</b>程序設計教程之性能的詳細資料課件說明

    C++17 STL標準庫學習教材電子書免費下載

    C++標準模板庫(STL)。這本書中的例子展示了如何充分的利用STL。不過,作為本書的第1章,我們還是需要了解一下那些比較重要的新語言特性。
    發(fā)表于 02-28 08:00 ?7次下載
    <b class='flag-5'>C</b>++17 <b class='flag-5'>STL</b>標準庫學習教材電子書免費下載

    C語言教程:STL-for-each算法

    C語言教程:STL-for-each算法(電源技術版面費5400)-文檔為C語言教程:STL-for-each
    發(fā)表于 09-17 12:42 ?3次下載
    <b class='flag-5'>C</b>語言教程:<b class='flag-5'>STL</b>-for-each<b class='flag-5'>算法</b>

    STL的概述

    C++ STL 是一套功能強大的 C++ 模板類,提供了通用的模板類和函數(shù),這些模板類和函數(shù)可以實現(xiàn)多種流行和常用的算法,關于 STL 呢,
    的頭像 發(fā)表于 01-20 17:08 ?1374次閱讀
    <b class='flag-5'>STL</b>的概述

    C++STL庫中的容器

    前面跟大家介紹過STL庫,STL主要是由6大部分組成,其中第一個提到的就是容器,容器在介紹STL中小哥有簡單的跟大家介紹過,今天稍微再詳細介紹一下
    的頭像 發(fā)表于 02-21 10:55 ?1201次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b><b class='flag-5'>STL</b>庫中的容器

    C++ STL基本概念是什么

    STL,英文全稱 standard template library,中文可譯為標準模板庫或者泛型庫,其包含有大量的模板類和模板函數(shù),是 C++ 提供的一個基礎模板的集合,用于完成諸如輸入/輸出、數(shù)學計算等功能。
    的頭像 發(fā)表于 02-27 15:56 ?1355次閱讀
    <b class='flag-5'>C++</b> <b class='flag-5'>STL</b>基本概念是什么

    C++入門通用算法

    C++ 是一種強大的編程語言,它提供了許多通用算法,可以用于各種容器類型。這些算法是通過迭代器來操作容器中的元素,因此它們是通用的,可以用于不同類型的容器。在本篇博客中,我們將詳細介紹 C++
    的頭像 發(fā)表于 05-17 09:40 ?655次閱讀

    STL內容介紹

    1 什么是STLSTL(Standard Template Library),即標準模板庫,是一個具有工業(yè)強度的,高效的C++程序庫。它被容納于
    的頭像 發(fā)表于 11-13 11:32 ?830次閱讀
    <b class='flag-5'>STL</b>內容介紹
    RM新时代网站-首页