栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

容器和算法的改进 --- C++20

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

容器和算法的改进 --- C++20

容器和算法的改进 — C++20

C++ 20对容器和算法有很多的改进

  • std::vector 和std::string支持constexpr
  • 所有容器支持consistent container erasure , contains
  • 新的算法移动元素 std::shift_left
  • 可以检查 std::string 的前缀和后缀
支持 constexpr 的容器和算法
  1. C++ 20的std::vector和std::string支持constexpr
  2. 超过100多种algorithm支持constexpr

这样, 你就可以实现在编译期查找字符串子串, 在编译期对数组进行排序

#include 
#include 
#include 
#include 
#include 
#include 
#include 

consteval int maxEle()
{
	std::vector v{2, 4, 1, 6, 3, 8};
	std::sort(v.begin(), v.end());
	return v.back();
}

consteval bool findSub(std::string s, std::string sub)
{
	return s.find(sub, 0) != std::string::npos;
}


int main()
{
	

	constexpr int maxVal = maxEle();
	std::cout << maxVal << std::endl;

	std::cout << findSub("ianaworld", "world") << std::endl;
}

之所以能容器能在编译期能实现这些操作, 是因为使用了瞬态分配 Transient Allocation

Transient Allocation 瞬态分配

Transient Allocation: 编译期申请的内存必须在编译期就释放, 不能将编译期申请的内存在运行时使用

#include 

constexpr auto correctRelease()
{
	auto* p = new int[2020];
	delete [] p;
	return 2020;
}

constexpr auto forgottenRelease()
{
	auto* p = new int[2020];
	return 2020;
}

constexpr auto falseRelease()
{
	auto* p = new int[2020];
	delete p;
	return 2020;
}

int main()
{
	constexpr int res1 = correctRelease();
	constexpr int res2 = forgottenRelease();
	constexpr int res3 = falseRelease();
}

从容其中移除元素 在C++20 前是有一些复杂的
#include 
#include 
#include 

int main()
{
	std::cout << 'n';

	std::vector myVec{-2, 3, -5, 10, 3, 0, -5};

	for (auto ele : myVec) std::cout << ele << " ";
	std::cout << "nn";

	std::remove_if(myVec.begin(), myVec.end(), [](int ele) { return ele < 0; });
	for (auto ele : myVec) std::cout << ele << " ";

	std::cout << "nn";
}

因为没有应用新的end , 所以需要像下面这样做

#include 
#include 
#include 

int main()
{
	std::cout << 'n';

	std::vector myVec{-2, 3, -5, 10, 3, 0, -5};

	for (auto ele : myVec) std::cout << ele << " ";
	std::cout << "nn";

	auto newEnd = std::remove_if(myVec.begin(), myVec.end(),
	                             [](int ele) { return ele < 0; });
	myVec.erase(newEnd, myVec.end());
	// myVec.erase(std::remove_if(myVec.begin(), myVec.end(),
	// [](int ele){ return ele < 0; }), myVec.end());
	for (auto ele : myVec) std::cout << ele << " ";

	std::cout << "nn";
}

C++ 20 之后
#include 
#include 
#include 

int main()
{
	std::cout << 'n';

	std::vector myVec{-2, 3, -5, 10, 3, 0, -5};

	std::erase_if(myVec, [](int ele) { return ele >= 3; });

	for (int my_vec : myVec)
	{
		std::cout << my_vec<<"  ";
	}
}

其他容器也类似

contains函数

可以方便的判断容器是否包含一个元素

C++ 20 之前
#include 
#include 

int main()
{
	std::cout << 'n';

	std::set mySet{3, 2, 1};
	if (mySet.find(2) != mySet.end())
	{
		std::cout << "2 inside" << 'n';
	}

	std::multiset myMultiSet{3, 2, 1, 2};
	if (myMultiSet.count(2))
	{
		std::cout << "2 inside" << 'n';
	}

	std::cout << 'n';
}

比较长,并且对初学者不友好

C++ 20
#include 
#include 
#include 

int main()
{
	std::cout << std::boolalpha;

	std::cout << 'n';

	std::set mySet{3, 2, 1};
	std::cout << mySet.contains(2) << " ";
	
}

这样就非常的简单了

std::shift_left/right

std::shift_left, std::shift_right - C++中文 - API参考文档 (apiref.com)

字符串前缀和后缀检查
  • starts_with
  • ends_with

Algorithms library - cppreference.com

文 - API参考文档 (apiref.com)](https://www.apiref.com/cpp-zh/cpp/algorithm/shift.html)

字符串前缀和后缀检查
  • starts_with
  • ends_with

Algorithms library - cppreference.com

std::shift_left, std::shift_right - C++中文 - API参考文档 (apiref.com)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/983782.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号