string_view理解与用法(二)

C++ string核心用法与性能优化:从基础到实战 在C++编程中,字符串处理是基础且高频的操作。std::string作为标准库提供的字符串类,封装了字符序列的存储与管理,其内部通常采用动态数组实现,并可能应用短字符串优化(SSO)等策略以提升短字符串的处理性能。理解其内存管理与操作原理,对于编写高效、安全的代码至关重要。string的技术价值在于它提供了比C风格字符串更安全、更便捷的接口,自动管理内存,避免了缓冲区溢出等常见问题。在实际应用中,string广泛用于文本处理、数据解析、配置读取等场景。本文聚焦于string的核心操作、性能陷阱及与strin 阅读详情

以前写了《string_View理解与用法(一)》和《详解C++17下的string_view》,请参考。

本篇文章从string_view引入的背景出发,依次介绍了其相关的知识点及使用方式,然后对常见的使用陷阱进行了说明,最后对该类型做总结。

一、背景

在日常C/C++编程中,我们常进行数据的传递操作,比如,将数据传给函数。当数据占用的内存较大时,减少数据的拷贝可以有效提高程序的性能。在C中指针是完成这一目的的标准数据结构,而C++引入了安全性更高的引用类型。所以在C++中若传递的数据仅仅只读,const string&成了C++的天然的方式。但这并非完美,从实践来看,它至少有以下几方面问题:

  1. 字符串字面值、字符数组、字符串指针的传递仍要数据拷贝
    这三类低级数据类型与string类型不同,传入时,编译器需要做隐式转换,即需要拷贝这些数据生成string临时对象。const string&指向的实际上是这个临时对象。通常字符串字面值较小,性能损耗可以忽略不计;但字符串指针和字符数组某些情况下可能会比较大(比如读取文件的内容),此时会引起频繁的内存分配和数据拷贝,会严重影响程序的性能。
  2. substr O(n)复杂度
    这是一个特别常用的函数,好在std::string提供了这个函数,美中不足的是其每次都返回一个新生成的子串,很容易引起性能热点。实际上我们本意并不是要改变原字符串,为什么不在原字符串基础上返回呢?

在C++17中引入了string_view,能很好的解决以上两个问题。

二、std::string_view

从名字出发,我们可以类比数据库视图,view表示该类型不会为数据分配存储空间,而且该数据类型只能用来读。该数据类型可通过{数据的起始指针,数据的长度}两个元素表示,实际上该数据类型的实例不会具体存储原数据,仅仅存储指向的数据的起始指针和长度,所以这个开销是非常小的。

要使用字符串视图,需要引入<string_view>,下面介绍该数据类型主要的API。这些API基本上都有constexpr修饰,所以能在编译时很好地处理字符串字面值,从而提高程序效率。

2.1 构造函数

constexpr string_view() noexcept;
constexpr string_view(const string_view& other) noexcept = default;
constexpr string_view(const CharT* s, size_type count);
constexpr string_view(const CharT* s);

基本上都是自解释的,唯一需要说明的是:为什么我们代码string_view foo(string("abc"))可以编译通过,但为什么没有对应的构造函数?

实际上这是因为string类重载了string到string_view的转换操作符:
operator std::basic_string_view<CharT, Traits>() const noexcept;

所以,string_view foo(string("abc"))实际执行了两步操作:

  1. string("abc")转换为string_view对象a
  2. string_view使用对象本篇文章从string_view引入的背景,

2.2 自定义字面量

自定义字面量也是C++17新增的特性,提高了常量的易读。
下面的代码取值cppreference,能很好地说明自定义字面值和字符串语义的差异。

#include <string_view>
#include <iostream>
 
int main()
{
    using namespace std::literals;
 
    std::string_view s1 = "abc\0\0def";
    std::string_view s2 = "abc\0\0def"sv;
    std::cout << "s1: " << s1.size() << " \"" << s1 << "\"\n";
    std::cout << "s2: " << s2.size() << " \"" << s2 << "\"\n";
}

输出:

s1: 3 "abc"
s2: 8 "abc^@^@def"

以上例子能很好看清二者的语义区别,\0对于字符串而言,有其特殊的意义,即表示字符串的结束,字符串视图根本不care,它关心实际的字符个数。

2.3 成员函数

下面列举其成员函数:忽略了函数的返回值,若函数有重载,括号内用...填充。这样可以对其有个整体轮廓。

// 迭代器
begin()
end()
cbegin()
cend()
rbegin()
rend()
crbegin()
crend()
 
// 容量
size()
length()
max_size()
empty()
 
// 元素访问
operator[](size_type pos)
at(size_type pos)
front()
back()
data()
 
// 修改器
remove_prefix(size_type n)
remove_suffix(size_type n)
swap(basic_string_view& s)
 
copy(charT* s, size_type n, size_type pos = 0)
string_view substr(size_type pos = 0, size_type n = npos)
compare(...)
starts_with(...)
ends_with(...)
find(...)
rfind(...)
find_first_of(...)
find_last_of(...) 
find_first_not_of(...)
find_last_not_of(...)

从函数列表来看,几乎跟string的只读函数一致,使用string_view的方式跟string基本一致。有几个地方需要特别说明:

  1. string_view的substr函数的时间复杂度是O(1),解决了背景部分的第二个问题。
  2. 修改器中的三个函数仅会修改string_view的数据指向,不会修改指向的数据。

除此之外,函数名基本是自解释的。

2.4 示例

Haskell中有一个常用函数lines,会将字符串切割成行存储在容器里。下面我们用C++来实现

string-版本

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>

void lines(std::vector<std::string> &lines, const std::string &str) {
    auto sep{"\n"};
    size_t start{str.find_first_not_of(sep)};
    size_t end{};

    while (start != std::string::npos) {
        end = str.find_first_of(sep, start + 1);
        if (end == std::string::npos)
            end = str.length();

        lines.push_back(str.substr(start, end - start));
        start = str.find_first_not_of(sep, end + 1);
    }
}

上面我们用const std::string &类型接收待分割的字符串,若我们传入指向较大内存的字符指针时,会影响程序效率。

使用std::string_view可以避免这种情况:
string_view-版本

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <sstream>
#include <string_view>

void lines(std::vector<std::string> &lines, std::string_view str) {
    auto sep{"\n"};
    size_t start{str.find_first_not_of(sep)};
    size_t end{};

    while (start != std::string_view::npos) {
        end = str.find_first_of(sep, start + 1);
        if (end == std::string_view::npos)
            end = str.length();

        lines.push_back(std::string{str.substr(start, end - start)});
        start = str.find_first_not_of(sep, end + 1);
    }
}

上面的例子仅仅是把string类型修改成了string_view就获得了性能上的提升。一般情况下,将程序中的string换成string_view的过程是比较直观的,这得益于两者的成员函数的相似性。但并不是所有的“翻译”过程都是这样的,比如:

void lines(std::vector<std::string> &lines, const std::string& str) {
    std::stringstream ss(str);
    std::string line;

    while (std::getline(ss, line, '\n')) {
        lines.push_back(line);
    }
}

这个版本使用stringstream实现lines函数。由于stringstream没有相应的构造函数接收string_view类型参数,所以没法采用直接替换的方式,所以翻译过程要复杂点。

三、使用陷阱

世上没有免费的午餐。不恰当的使用string_view也会带来一系列的问题。

  1. string_view范围内的字符可能不包含\0

如
 

#include <iostream>
#include <string_view>

int main() {
    std::string_view str{"abc", 1};

    std::cout << str.data() << std::endl;

    return 0;
}

本来是要打印a,但输出了abc。这是因为字符串相关的函数都有一条兼容C的约定:\0代表字符串的结尾。上面的程序打印从开始到字符串结束的所有字符,虽然str包含的有效字符是a,但cout认\0。好在这块内存空间有合法的字符串结尾符,如果str指向的是一个没有\0的字符数组,程序很有可能会出现内存问题,所以我们在将string_view类型的数据传入接收字符串的函数时要非常小心。

2.从[const] char*构造string_view对象时间复杂度O(n)
这是因为获取字符串的长度需要从头开始遍历。如果对[const] char*类型仅仅是一些O(1)的操作,相比直接使用[const] char*,转为string_view是没有性能优势的。只不过是相比const string&,string_view少了拷贝的损耗。实际上我们完全可以用[const] char*接收所有的字符串,但这个类型太底层了,不便使用。在某些情况下,我们转为string_view可能仅仅是想用其中的一些函数,比如substr。

3.string_view指向的内容的生命周期可能比其本身短
string_view并不拥有其指向内容的所有权,用Rust的术语来说,它仅仅是暂时borrow(借用)了它。如果拥有者提前释放了,你还在使用这些内容,那会出现内存问题,这跟悬挂指针(dangling pointer)或悬挂引用(dangling references)很像。Rust专门有套机制在编译时分析变量的生命期,保证borrow的资源在使用期间不会被释放,但C++没有这样的检查,需要人工保证。下面列出一些典型的问题情况:

std::string_view sv = std::string{"hello world"}; 
string_view foo() {
    std::string s{"hello world"};
    return string_view{s};
}
auto id(std::string_view sv) { return sv; }

int main() {
    std::string s = "hello";
    auto sv = id(s + " world"); 
}

四、总结

string_view解决了一些痛点,但同时也引入了指针和引用的一些老问题。C++标准并没有对这个类型做太多的约束,这引来的问题是我们可以像平常的变量一样以多种方式使用它,如,可以传参,可以作为函数返回值,可以做普遍变量,甚至我们可以放到容器里。随着使用场景的复杂,人工是很难保证指向的内容的生命周期足够长。所以,推荐的使用方式:仅仅作为函数参数,因为如果该参数仅仅在函数体内使用而不传递出去,这样使用是安全的。

本文转自:https://segmentfault.com/a/1190000018387368

C++ string深度解析:从现代用法到底层实现与模拟 在C++编程中,字符串处理是基础且核心的操作。其原理基于动态内存管理和连续字符序列存储,通过RAII(资源获取即初始化)机制自动管理生命周期,有效避免了手动内存管理的常见错误。这项技术的价值在于提升开发效率、保障代码安全性与性能。在应用场景上,无论是系统级开发、游戏引擎、高频交易还是嵌入式系统,高效的字符串操作都至关重要。现代C++引入了string_view、移动语义等特性,进一步优化了性能。本文将聚焦于C++ string的现代使用范式,并深入探讨其底层实现机制,通过模拟实现一个String类来揭示其内 阅读详情

相关推荐

C++字符串处理实战:从std::string到string_view的避坑与优化指南

字符串处理是编程中的基础且核心的技术概念,它涉及数据在内存中的表示、操作与转换。其原理在于通过特定的数据结构(如C++中的std::string)管理字符序列,实现高效的存储、拼接、查找与解析。掌握字符串处理的底层机制对于提升程序健壮性、安全性及性能具有关键的技术价值,尤其在处理网络通信、文件解析、数据格式化等应用场景时至关重要。本文聚焦于C++标准库,深入探讨如何利用`std::string_view`避免不必要的拷贝,并通过预分配空间、移动语义等工程实践优化性能,帮助开发者规避常见陷阱,构建高效可靠的字

weixin_33690963的博客 491

【C++】C++ 17简单上手(2)——string_view

什么是string_view std::string_view是C++ 17标准中新加入的类,正如其名,它提供一个字符串的视图,即可以通过这个类以各种方法“观测”字符串,但不允许修改字符串。由于它只读的特性,它并不真正持有这个字符串的拷贝,而是与相对应的字符串共享这一空间。即——构造时不发生字符串的复制。同时,你也可以自由的移动这个视图,移动视图并不会移动原定的字符串。 正因这些特性,当你不需...

Pangda code twice 1万+

Qt中的 QStringView 类 - 轻量级的字符串查看器

在Qt5.10中,一个新的类 QStringView 被引入,它是一个用于访问QString对象中的字符数据的轻量级类。与QString类相比,它不需要分配内存,对于大型的字符串操作,使用QStringView可以提高性能和减少内存消耗。QStringView的主要优点是其简洁和效率,它只是一个只读的字符数组,允许您直接访问底层字符串数据而不进行任何复制或转换。它提供了一种轻量级的方法来访问底层字符串数据,同时又不会复制数据或进行其他的转换,从而提高了性能并减少了内存消耗。

PixelDude的博客 1688

string和string_view用法指南

我们编写的每个应用程序都会使用某种类型的字符串,使用C语言时,没有太多选择,只能使用普通的以'\0'结尾的字符数组表示的字符串。这种表达方式会导致许多问题,例如会导致安全漏洞的缓冲区溢出,C++标准库包含一个安全易用的std::string类,这个类符合RALL思想,没有这些缺点。

Thinking777的博客 2886

深度解读C++17中的std::string_view:解锁字符串处理的新境界

std::string_view是C++17引入的一个非拥有的字符串视图类型,它提供了一种轻量级的方式来访问现有字符串数据。std::string_view通过避免字符串复制和内存分配,它可以显著提高程序性能,并提供方便的字符串处理能力。但是,在使用过程中需要注意正确管理原始字符串的生命周期,以确保使用的字符串数据有效和安全。

Lion_Long的博客 6907

QT的QStringView类的使用

QStringView类是Qt框架中用于提供对QString对象的非拥有性只读访问的类。它可以在不复制字符串数据的情况下对字符串进行操作和查看,从而减少内存使用并提高性能。QStringView是Qt框架中的一个类,用于提供对QString对象的非拥有性只读访问。在本文中,我们将详细介绍QStringView类的使用方法,并提供相应的源代码示例。一旦创建了QStringView对象,您可以使用它来访问和操作字符串的内容。您可以根据具体需求选择适当的函数进行操作。QT的QStringView类的使用。

2301_79330511的博客 606

string_View理解与用法(一)

什么是string_view 当你创建一个将(常量)字符串作为参数的函数时,你有四个选择,你可能知道两个,但不知道另外两个: void TakesCharStar(const char* s); // C convention void TakesString(const string& s); // Old Standard C++ convention void TakesStringView(absl::string_view s);

danshiming的博客 9761

std::string 和 std::string_view

std::string与std::string_view核心区别:string拥有内存、可修改但拷贝成本高;string_view只是视图、只读但零拷贝。string适用于存储和修改字符串,而string_view最适合函数传参、只读操作等场景。关键规则:函数参数优先用string_view,存储变量必须用string。string_view能显著提升性能(不分配内存、不拷贝),但需注意其不管理内存的特性,不能用于需要修改或长期保存字符串的场景。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 287

轻松理解c++17的string_view

是一个高效的、不拥有的字符串视图类,设计用于提高字符串处理的性能和简便性。它在不复制字符串数据的情况下,提供了丰富的字符串操作接口,使得字符串处理更高效、代码更简洁。

性感的小君君 1087

在 ABAP CDS View Entity 中用好 Typed Character Literals:彻底搞懂 CHAR、SSTRING、STRING 与尾随空格

ABAP CDS中的类型化字面量(typed literal)对开发质量有重要影响。本文通过示例分析了字符型字面量在CDS视图实体中的类型安全处理机制,重点探讨了CHAR、SSTRING和STRING三种类型对尾随空格的不同处理规则。研究表明,类型化字面量不仅能增强语义清晰度,还能减少不必要的类型转换,符合Clean Core原则。文章详细解析了类型长度与有效值的区别,并列举了在状态码、格式文本和服务暴露等实际场景中的应用差异,为ABAP开发者在S/4HANA等高标准项目中正确使用类型化字面量提供了实用指导

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3216

【仿真】Carla Python API实战:从零搭建自动驾驶测试环境

本文详细介绍了如何使用Carla Python API从零搭建自动驾驶测试环境。通过Carla仿真平台,开发者可以构建高度逼真的城市环境和车辆物理模型,利用Python API实现传感器配置、数据采集、场景构建及自动驾驶算法集成。文章还分享了实际项目中的调试技巧和性能优化经验,帮助读者快速掌握自动驾驶仿真测试的核心技术。

weixin_29050513的博客 213

string_view 与 string 的差异及其重要性分析

是 C++ 标准库中的一个类,专门用于表示和操作字符序列 1。它不仅存储了字符数据,还包含了诸如字符串大小和容量等元数据 9。作为 C++ 中三种连续容器之一,保证其字符存储在内存中的一个连续区域内,从而实现了通过索引对单个字符进行高效的随机访问,其时间复杂度为 O(1) 9。C++ 标准对各种字符串操作的复杂度提出了要求,但并没有具体规定的内部实现或确切大小。这种灵活性使得标准库的实现者可以针对不同的架构和使用场景进行优化 9。

ROOT_pd的博客 1737

海康威视工业相机SDK二次开发实战:多相机同步采集与图像存储

本文详细介绍了海康威视工业相机SDK二次开发实战,包括多相机同步采集与图像存储的优化方案。通过MVS软件搭建开发环境,实现硬件与软件触发同步采集,并提供高效的图像存储管理技巧,帮助开发者提升工业视觉项目的效率与稳定性。

weixin_29168813的博客 666

深入理解C++17中的std::string_view

只读字符串参数传递解析和查看大型字符串高频字符串操作需要兼容多种字符串类型的接口正确使用时可以显著提升程序性能,但需要时刻注意其非拥有的特性。掌握的使用是现代C++高效字符串处理的关键技能。进一步学习《Effective Modern C++》条款15-17SL.str.11。

sillyss的博客 1875

团结引擎+OpenHarmony 记录 (持续更新中)

获取不到的原因是因为二者不在同一个线程中,所以数据没有同步。而 globalThis.context 数据进行了同步。(TuanjieMainWorkerHandler.ts中可以看到)在进行绘制 UI 的时候 ,如果组件有 Native API 就可能不会显示出来,例如 web 控件就不能展示出来,刚加上权限的时候 会报错 因为缺少 reason ,添加上就不会报错了。只有纯 UI 控件是可以展示出来的,注释掉 web控件后就可以。

m_cainiaokuaifei的博客 1492

ROS水下仿真神器uuv_simulator:从零搭建水下机器人测试环境(附Gazebo配置全流程)

本文详细介绍了如何使用ROS和uuv_simulator从零搭建水下机器人仿真测试环境,包括Gazebo配置全流程。通过系统环境准备、水下世界构建、机器人模型定制开发等步骤,帮助开发者在虚拟海洋环境中高效验证算法,大幅降低研发成本。特别适合水下机器人研发人员参考。

ujm5678901的博客 263

std::string_view 与 std::string

std::string_view 与 std::string

深耕嵌入式领用多年, 致力于分享嵌入式领域技术! 1038

基于DNN神经网络的多输入多输出数据回归预测(附带Matlab代码)

假设我们的输入数据包含n个特征,输出数据包含m个特征。在本文中,我们将介绍如何使用DNN(深度神经网络)实现多输入多输出数据回归预测,并提供相应的Matlab代码。需要注意的是,上述代码中的DNN模型是一个简化的示例,您可以根据实际任务的复杂程度和要求进行相应的调整和优化。综上所述,我们介绍了如何使用DNN神经网络实现多输入多输出数据回归预测,并提供了相应的Matlab代码。函数对DNN模型进行训练,其中输入数据需要转置,以适应网络的输入要求。最后,我们使用训练好的模型对测试数据进行预测,并打印预测结果。

DevWizard的博客 1068

C++ 17 新特性 C++ String View:了解C++ 17 std::string_view的使用场景

# 第一章: 引言:字符串处理在C++中的重要性 在探索编程语言的世界中,字符串处理无疑是其中最为核心和频繁的任务之一。在C++中,字符串不仅是信息交流的基础,也是程序逻辑和数据处理的关键组成部分。就像在现实生活中,我们用语言来表达想法和感受,程序中的字符串则是表达和储存数据的基本方式。 ## 1.1 字符串在编程中的角色 字符串

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1万+

Prometheus+Grafana+alertmanager+PrometheusAlert监控告警 实现飞书告警

以上 是以grafana做的邮件告警,但是感觉邮件很少人看。下面是以webhook 可以接入。启动alertmanager (设置 开机在启动)下载prometheusalter 配置文件。这里的告警是基于grafana上搭建的。我们启动PrometheusAlert。写完之后进行重启Prometheus。prometheus 的告警规则。测试 基于我们生产环境做的文档。然后在grafana上导模板。上导入模板就可以 直接引用。访问 grafana页面。重启一下grafana。

墨痕诉清风的博客 859

Python全栈入门到实战【基础篇 19】函数进阶:默认参数、递归函数与偏函数应用

本文深入探讨Python函数进阶的三大核心知识:默认参数、递归函数与偏函数。针对默认参数,揭示了可变对象作为默认值的陷阱,提出使用None替代的方案;解析递归函数的三大要素(终止条件、递归调用、问题拆解),并通过阶乘和斐波那契数列示例演示实现方法,同时给出尾递归和缓存装饰器两种优化策略;最后介绍偏函数如何通过functools.partial固化参数简化调用。这些技巧能显著提升函数在复杂场景下的灵活性与复用性,帮助开发者编写更高效的Python代码。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 3864

【c++】std::string、std::string_view 与 C-style 字符串,以及优先使用string_view

在 C++ 中,选择正确的字符串类型和合理的转换方式,不仅能提升程序的性能,也能减少内存管理的复杂性。理解这三者之间的关系是高效编写 C++ 代码的基础。适用于需要对字符串进行修改和动态内存管理时。适用于避免不必要的字符串拷贝,提升性能的场合。用于与 C 语言兼容,或在性能要求极高的情况下使用。

m0_74282926的博客 855

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的农作物害虫检测系统(深度学习模型+UI界面+训练数据集)

随着人工智能技术在农业领域的深入应用,基于深度学习的害虫检测系统已成为智慧农业的重要组成部分。本文详细介绍了一种基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的农作物害虫检测系统,涵盖算法原理、数据集构建、模型训练、系统实现及完整代码。该系统能够实时检测并识别多种农作物害虫,为农业生产提供精准的病虫害监测解决方案。

YOLO 273

C++字符序列:从内存编码到std::string与string_view高效实践

字符序列是编程中处理文本数据的基础概念,涉及内存中字节的组织与解释。其核心原理在于通过特定编码规则(如ASCII、UTF-8)将字符映射为二进制数据,并在内存中连续存储。理解这一原理对实现高效、安全的文本处理至关重要,直接关系到程序的内存安全与性能。在C++工程实践中,字符序列的技术价值通过多种工具体现:C风格字符串提供底层控制但易出错;std::string通过自动内存管理(包括**短字符串优化SSO**)提升了开发效率与安全性;而C++17引入的**std::string_view**则实现了零成本的只

weixin_30432579的博客 642

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C++ string and string_view(这篇教你怎么用)

C++ string 导航专用string(不可变字符串)string 变量定义string 输入输出string 求长度string c++ 转化为 c 风格字符串string 访问单个字符string 字符串拼接string 插入string 删除string 提取子字符串string 查找子串string → string_view(可变字符串)string_view 声明及定义string_view 长度string_view 修改字符串string_view 的其他行为 string(不可变字符串

嘟嘟的博客 9584

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【C++17 library features】深入解析 C++17 中的 std::string_view

在软件开发的旅程中,选择合适的数据类型和工具是决定项目成败的关键一步。C++17 引入的 `std::string_view` 为字符串处理带来了新的思考方式,正如古希腊哲学家赫拉克利特所说:“唯一不变的就是变化。” `std::string_view` 的出现正是为了应对现代编程中对高效、灵活字符串处理的需求。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 1819

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: string_View理解与用法(一)
下一篇: 字符串后缀sv和s的理解、用法
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值