C字符串与C++ string 类:用法万字详解(下)

news2024/11/24 19:16:20

目录

引言

一、string类对象的修改操作

1.1 push_back()

1.2 append()

1.3 operator+=()

1.4 c_str()

1.5 substr()

1.6 find()

1.7 rfind()

二、string类非成员函数

2.1 operator+()

2.2 operator<<()

2.3 operator>>()

2.4 getline()

2.5 relational operators​编辑

结语


引言

🔍在本博客中,我们将一起踏入string类的奥秘世界,探索它的对象修改操作。我们将学会如何添加、删除、替换甚至是重塑字符串,就像在迷宫中开辟新的通路一样。而为了更好地解谜,我们还将了解一些非成员函数,这些函数就像是迷宫中的暗门,为我们提供了额外的洞察力和力量。

无论是解决实际问题,还是纯粹的编程乐趣,string类都是你的得力助手。让我们一起踏上这段关于C++魔法宝剑的探险之旅吧!🚀📜

一、string类对象的修改操作

1.1 push_back()

 在 C++ 中,std::string具有一个名为 push_back() 的成员函数,用于向字符串的末尾添加一个字符。

以下是使用 push_back() 函数的示例:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello";
    std::cout << "Before push_back: " << str << std::endl;

    str.push_back('!');  // 向字符串末尾添加 '!'
    
    std::cout << "After push_back: " << str << std::endl;

    return 0;
}

在上面的示例中,我们首先创建了一个字符串 str("Hello"),然后使用 push_back() 函数将字符'!' 添加到字符串的末尾,使其变为 "Hello!"。

需要注意的是,push_back() 函数只能添加一个字符到字符串末尾。

1.2 append()

 在 C++ 中,std::string具有名为 append() 的成员函数,它用于将一个字符串子串字符序列添加到另一个字符串的末尾。

下面对主要的版本进行解释

  1. string& append (const string& str); 这个重载版本接受一个 std::string 对象作为参数,它将参数中的字符串内容追加到当前字符串的末尾。

  2. string& append (const string& str, size_t subpos, size_t sublen); 这个版本允许你从参数字符串的指定位置 subpos 开始,追加长度为 sublen 的子串到当前字符串末尾。

  3. string& append (const char* s); 该版本接受一个 C 风格的字符串指针作为参数,将参数字符串内容追加到当前字符串的末尾。

  4. string& append (const char* s, size_t n); 这个版本与上一个版本类似,但是你可以指定要追加的字符数 n,而不是追加整个 C 字符串。

  5. string& append (size_t n, char c); 这个版本在当前字符串的末尾添加 n 个字符 c,用于填充指定数量的字符。

以下是使用 append() 函数的示例:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello";
    std::cout << "Before append: " << str << std::endl;

    str.append(", world!");  // 将子串 ", world!" 添加到字符串末尾
    
    std::cout << "After append: " << str << std::endl;

    return 0;
}

在上述示例中,我们首先创建了一个字符串 str("Hello"),然后使用 append() 函数将子串 ", world!" 添加到字符串的末尾,使其变为 "Hello, world!"。

append() 函数可以接受多种不同类型的参数,包括 C 字符串、std::string 对象、字符序列等。这使得你能够很方便地将不同类型的文本内容追加到一个字符串中。

总之,append() 函数是用于向 std::string 的末尾添加字符串、子串或字符序列的成员函数,它可以实现字符串的动态拼接

1.3 operator+=()

在C++中,std::string 类支持 operator+= 运算符重载,允许你将一个字符串或字符序列追加到另一个字符串的末尾。这是一种便捷的方式来修改字符串内容。

 对各个版本进行解释

  1. string& operator+= (const string& str); 这个重载版本接受一个 std::string 对象作为参数,它将参数中的字符串内容追加到当前字符串的末尾。

  2. string& operator+= (const char* s); 该版本接受一个 C 风格的字符串指针作为参数,将参数字符串内容追加到当前字符串的末尾。

  3. string& operator+= (char c); 这个版本接受一个字符 c 作为参数,将这个字符追加到当前字符串的末尾。

以下是使用 operator+= 运算符的示例:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello";
    std::cout << "Before operator+=: " << str << std::endl;

    str += ", world!";  // 使用 operator+= 将 ", world!" 追加到字符串末尾
    
    std::cout << "After operator+=: " << str << std::endl;

    return 0;
}

在上述示例中,我们首先创建了一个字符串 str("Hello"),然后使用 operator+= 运算符将 ", world!" 追加到字符串的末尾,使其变为 "Hello, world!"。

你可以将任何能够隐式转换为 std::string 对象的类型与 operator+= 运算符一起使用,这包括字符串、字符、C 字符串等。

1.4 c_str()

在 C++ 中,std::string 类的成员函数 c_str() 用于获取一个指向以 null 结尾的 C 字符串(即 C 风格字符串)的指针,该字符串与 std::string 对象的内容相同。这个函数通常在需要将 std::string 转换为 C 字符串的场景中很有用。 

 以下是如何使用 c_str() 函数的示例:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, world!";
    
    const char *cstr = str.c_str();  // 获取与字符串内容相同的 C 字符串
    
    std::cout << "C-style string: " << cstr << std::endl;

    return 0;
}

在上述示例中,我们使用 c_str() 函数获取了与字符串 str内容相同的 C 字符串,并将其指针赋值给 cstr。然后,我们通过 cout 输出了这个 C 字符串。

需要注意的是,c_str() 函数返回的指针指向的 C 字符串是一个常量,不能通过这个指针修改字符串的内容。

总之,c_str() 函数是一个方便的方法,可以将 std::string 转换为 C 字符串,适用于需要与 C 风格函数或库进行交互的情况

1.5 substr()

 substr() 函数接受两个参数:起始索引位置和子串的长度。它返回一个新的 std::string 对象,其中包含了从起始索引开始的指定长度的子串。

以下是 substr() 函数的用法示例:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, world!";
    
    std::string sub = str.substr(7, 5); // 从索引位置 7 开始,提取长度为 5 的子串
    
    std::cout << "Substring: " << sub << std::endl;

    return 0;
}

在上面的示例中,我们首先创建了一个字符串 str("Hello, world!"),然后使用 substr() 函数从索引位置 7 开始,提取长度为 5 的子串,即 "world"。

需要注意的是,substr() 函数不会修改原始字符串,而是返回一个新的字符串如果不提供长度参数,substr() 函数将提取从指定索引到字符串末尾的所有字符。

1.6 find()

 在 C++ 的标准库中std::string提供了 find() 成员函数用于在字符串中查找子串或字符,并返回找到的第一个匹配位置的索引。如果未找到,则返回一个特定的无效位置。

解释一下重载版本

  1. size_t find (const string& str, size_t pos = 0) const; 这个重载版本接受一个 std::string 对象作为参数,以及一个可选的起始搜索位置 pos。它在字符串中从指定位置开始查找给定的子串,并返回找到的第一个匹配位置的索引。

  2. size_t find (const char* s, size_t pos = 0) const; 该版本接受一个 C 风格的字符串指针作为参数,以及一个可选的起始搜索位置 pos。它在字符串中从指定位置开始查找给定的 C 字符串,并返回找到的第一个匹配位置的索引。

  3. size_t find (const char* s, size_t pos, size_t n) const; 这个版本接受一个 C 风格的字符串指针和一个长度参数 n,以及一个起始搜索位置 pos。它在字符串中从指定位置开始查找给定长度的字符数组,并返回找到的第一个匹配位置的索引。

  4. size_t find (char c, size_t pos = 0) const; 最后一个版本接受一个字符 c 作为参数,以及一个可选的起始搜索位置 pos。它在字符串中从指定位置开始查找给定字符,并返回找到的第一个匹配位置的索引。

以下是 find() 函数的基本用法示例:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, world!";
    
    size_t found = str.find("world"); // 在字符串中查找 "world"
    
    if (found != std::string::npos) {
        std::cout << "Substring found at position: " << found << std::endl;
    } else {
        std::cout << "Substring not found" << std::endl;
    }

    return 0;
}

在上面的示例中,我们使用 find() 函数在字符串 str 中查找子串 "world"。如果找到了子串,find() 函数会返回子串的第一个字符在原字符串中的索引位置。如果未找到,它会返回一个特定的常量值 std::string::npos

解释一下std::string::npos

std::string::nposstd::string中的一个静态成员变量,它表示字符串中的无效位置或未找到的位置。当在字符串中执行查找操作但未找到目标子串或字符时,查找函数会返回这个特定的值作为索引。

具体来说,std::string::npos 是一个 size_t 类型的常量,通常是一个最大可能的值,用来表示无效的位置。在 C++ 标准库中,它的值是 std::numeric_limits<std::streamsize>::max()但在大多数情况下,你只需要将它视为一个用于表示无效位置的特殊值。

1.7 rfind()

 std::string提供了 rfind() 成员函数,用于在字符串中从后往前查找指定的子串或字符,并返回找到的最后一个匹配位置的索引。如果未找到,它会返回特定的无效位置。

解释一下重载版本

  1. size_t rfind (const string& str, size_t pos = npos) const; 这个重载版本接受一个 std::string 对象作为参数,以及一个可选的起始搜索位置 pos。它从后往前在字符串中查找给定的子串,并返回找到的最后一个匹配位置的索引。

  2. size_t rfind (const char* s, size_t pos = npos) const; 该版本接受一个 C 风格的字符串指针作为参数,以及一个可选的起始搜索位置 pos。它从后往前在字符串中查找给定的 C 字符串,并返回找到的最后一个匹配位置的索引。

  3. size_t rfind (const char* s, size_t pos, size_t n) const; 这个版本接受一个 C 风格的字符串指针和一个长度参数 n,以及一个起始搜索位置 pos。它从后往前在字符串中查找给定长度的字符数组,并返回找到的最后一个匹配位置的索引。

  4. size_t rfind (char c, size_t pos = npos) const; 最后一个版本接受一个字符 c 作为参数,以及一个可选的起始搜索位置 pos。它从后往前在字符串中查找给定字符,并返回找到的最后一个匹配位置的索引。

这些 rfind() 函数的不同重载版本提供了多种方式来从后往前在 std::string 中查找指定的子串、字符或字符数组,返回找到的最后一个位置的索引,或者返回 std::string::npos,如果未找到匹配项。

以下是 rfind() 函数的使用示例:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, world! Hello!";
    
    size_t found = str.rfind("Hello"); // 从后往前查找子串 "Hello"
    
    if (found != std::string::npos) {
        std::cout << "Substring found at position: " << found << std::endl;
    } else {
        std::cout << "Substring not found" << std::endl;
    }

    return 0;
}

在这个示例中,我们使用 rfind() 函数在字符串 str 中从后往前查找子串 "Hello"。如果找到了子串,rfind() 函数会返回最后一个匹配的子串的第一个字符在原字符串中的索引位置。如果未找到,它会返回一个特定的常量值 std::string::npos

类似于 find() 函数,rfind() 函数也有多个重载版本,可以用于查找字符、C 字符串以及指定起始位置的情况。

二、string类非成员函数

2.1 operator+()

operator+ 是 C++ 中的加法运算符,可以用于执行不同类型的加法操作。对于 std::string 类型,operator+ 也被重载,用于连接(拼接)两个字符串。

重载函数解释

  1. string operator+ (const string& lhs, const string& rhs); 这个重载版本接受两个 std::string 对象作为参数,并返回一个新的字符串,其中包含两个操作数的内容连接在一起。

  2. string operator+ (const string& lhs, const char* rhs);

  3. string operator+ (const char* lhs, const string& rhs);                                     这两个版本接受一个 std::string 对象和一个 C 字符串指针作为参数,或者一个 C 字符串指针和一个 std::string 对象作为参数。它们返回一个新的字符串,其中包含两个操作数的内容连接在一起。

  4. string operator+ (const string& lhs, char rhs);

  5. string operator+ (char lhs, const string& rhs);                                                  这两个版本接受一个 std::string 对象和一个字符,或者一个字符和一个 std::string 对象作为参数。它们返回一个新的字符串,其中包含操作数的内容连接在一起。

以下是使用这些 operator+ 运算符的示例: 

#include <iostream>
#include <string>

int main() {
    std::string str1 = "Hello, ";
    std::string str2 = "world!";
    
    std::string result1 = str1 + str2; // 连接两个字符串
    std::string result2 = str1 + "C++"; // 连接一个字符串和一个 C 字符串
    std::string result3 = "Welcome " + str2; // 连接一个 C 字符串和一个字符串
    std::string result4 = str1 + '!'; // 连接一个字符串和一个字符
    
    std::cout << "Result 1: " << result1 << std::endl;
    std::cout << "Result 2: " << result2 << std::endl;
    std::cout << "Result 3: " << result3 << std::endl;
    std::cout << "Result 4: " << result4 << std::endl;

    return 0;
}

通过使用这些重载的 operator+ 运算符,可以方便地连接不同类型的字符串和字符,得到一个新的字符串。

2.2 operator<<()

 operator<< 是 C++ 中的输出流运算符,通常用于将数据输出到流(如标准输出流 cout)中。对于 std::string 类型,operator<< 也被重载,用于将字符串内容输出到流中。

以下是 std::string 类中 operator<< 运算符的使用示例:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, world!";
    
    std::cout << "String: " << str << std::endl;

    return 0;
}

在上面的示例中,我们使用 operator<< 运算符将字符串 str 的内容输出到标准输出流 cout 中。输出结果为:

 需要注意的是operator<< 运算符用于将字符串内容输出到流中,而不是将字符串对象本身作为字符串输出。也就是说,它不会输出字符串的长度或其他信息,而只会输出字符串的内容。

2.3 operator>>()

 operator>> 是 C++ 中的输入流运算符,通常用于从流(如标准输入流 cin)中读取数据。对于 std::string 类型,operator>> 也被重载,用于从流中读取字符串数据。 

以下是 std::string 类中 operator>> 运算符的使用示例:

#include <iostream>
#include <string>

int main() {
    std::string str;
    
    std::cout << "Enter a string: ";
    std::cin >> str;

    std::cout << "You entered: " << str << std::endl;

    return 0;
}

在上面的示例中,我们使用 operator>> 运算符从标准输入流 cin 中读取用户输入的字符串,并将其存储在字符串变量 str 中。然后,我们使用 operator<< 运算符将用户输入的字符串输出到标准输出流中。

需要注意的是,operator>> 运算符默认以空格为分隔符,所以它会读取并存储用户输入的一个单词,直到遇到空格或换行符为止。如果你需要读取整行输入,可以使用 std::getline() 函数。

2.4 getline()

std::getline() 是 C++ 标准库中的一个函数,用于从输入流中读取一行文本,并将其存储到一个字符串对象中。这个函数可以读取包括空格在内的整行内容,直到遇到换行符为止。

以下是 std::getline() 函数的使用示例:

#include <iostream>
#include <string>

int main() {
    std::string line;
    
    std::cout << "Enter a line of text: ";
    std::getline(std::cin, line); // 从标准输入读取一行文本

    std::cout << "You entered: " << line << std::endl;

    return 0;
}

 需要注意的是,std::getline() 函数接受两个参数:第一个参数是输入流(如 std::cin),第二个参数是一个字符串对象,用于存储读取的内容。它会读取整行文本,包括空格,但不会将换行符放入结果字符串中。

重载版本解释

  • is: 输入流对象,如 std::cin
  • str: 要存储读取内容的 std::string 对象。
  • delim: 指定的分隔符字符。默认情况下,分隔符为换行符 \n

如果你希望使用除换行符之外的其他分隔符,你可以在函数调用中提供第三个参数,例如:

在这个示例中,std::getline() 函数会读取输入流中的一行文本,直到遇到分号为止,并将读取的内容存储在字符串对象 line 中。 

2.5 relational operators

 详细解释

bool operator== (const string& lhs, const string& rhs);

 bool operator== (const char* lhs, const string& rhs);

 bool operator== (const string& lhs, const char* rhs);

    以上三个版本的 operator== 运算符用于检查左边的字符串和右边的字符串(或C字符串)是否相等。

bool operator!= (const string& lhs, const string& rhs);

 bool operator!= (const char* lhs, const string& rhs);

 bool operator!= (const string& lhs, const char* rhs);

    以上三个版本的 operator!= 运算符用于检查左边的字符串和右边的字符串(或C字符串)是否不相等。

bool operator< (const string& lhs, const string& rhs);

 bool operator< (const char* lhs, const string& rhs);

 bool operator< (const string& lhs, const char* rhs);

    以上三个版本的 operator< 运算符用于检查左边的字符串是否小于右边的字符串(或C字符串)。

bool operator<= (const string& lhs, const string& rhs);

 bool operator<= (const char* lhs, const string& rhs);

 bool operator<= (const string& lhs, const char* rhs);

    以上三个版本的 operator<= 运算符用于检查左边的字符串是否小于等于右边的字符串(或C字符串)。

bool operator> (const string& lhs, const string& rhs);

 bool operator> (const char* lhs, const string& rhs);

 bool operator> (const string& lhs, const char* rhs);

    以上三个版本的 operator> 运算符用于检查左边的字符串是否大于右边的字符串(或C字符串)。

bool operator>= (const string& lhs, const string& rhs);

 bool operator>= (const char* lhs, const string& rhs);

 bool operator>= (const string& lhs, const char* rhs);

    以上三个版本的 operator>= 运算符用于检查左边的字符串是否大于等于右边的字符串(或C字符串)。

结语

终于,我们来到了string详解系列的终点。通过这一系列的内容,相信你已经对C++中的string类有了更深入的了解。从基本用法到各种成员函数,我们探索了string类在处理字符串时的强大功能。🎉💡

但是故事并没有结束,更多精彩内容还在后头!接下来,我将为大家呈现模拟实现string以及深入解析string底层原理的文章。通过这些内容,你将更加深入地理解string的背后机制,为你的C++编程之路增添新的见解。🔍🛠️

所以,请继续关注,敬请期待即将到来的内容!如果在写作过程中有任何疑问或需要帮助,欢迎随时向我提问。让我们一同探索C++字符串的奥秘,创作出精彩的学习资源吧!🚀📚

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/859715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TFRecords详解

内容目录 TFRecords 是什么序列化(Serialization)tf.data 图像序列化&#xff08;Serializing Images)tf.Example函数封装 小结 TFRecords 是什么 TPU拥有八个核心&#xff0c;充当八个独立的工作单元。我们可以通过将数据集分成多个文件或分片&#xff08;shards&#xff09;…

phpstorm添加vue 标签属性绑定提示和提示vue的方法提示

v-text v-html v-once v-if v-show v-else v-for v-on v-bind v-model v-ref v-el v-pre v-cloak v-on:click v-on:keyup.enter v-on:keyup click change input number debounce transition :is :class把上面这些文字粘贴到点击右下角放大按钮 后的文本框里&#xff0c;然后保存…

混合云环境中 Kubernetes 可观测性的 6 个有效策略...

2023 年&#xff0c;原生云应用程序和平台将快速增长。组织不断努力最大限度地发挥其应用程序的潜力&#xff0c;确保无缝的用户体验并推动业务增长。 混合云环境的兴起以及 Kubernetes 等容器化技术的采用彻底改变了现代应用程序的开发、部署和扩展方式。 在这个数字领域&am…

Redis 搭建分片集群

文章目录 0.10.2 散列插槽0.3 集群伸缩0.3.1 需求分析0.3.1 创建新的 Redis 实例0.3.3 添加新节点到 Redis0.3.4 转移插槽 0.4 故障转移0.4.1 自动故障转移0.4.2 生动故障转移 0.5 RedisTemplate访问分片集群 1. 集群架构2. 准备实例和配置3. 启动4. 创建集群5. 测试 0.1 主从…

刷新缓冲区(标准IO)

标准IO是带缓冲的&#xff0c;输入和输出函数属于行缓冲&#xff0c;stdin、stdin、printf、scanf 1.换行符刷新 2.缓冲区满刷新 3.fflush函数强制刷新 4.程序正常结束

绩效考核,职场人的痛!

绩效&#xff0c;已经成为职场人不能跳过的话题。 绩效作为提高员工和企业效率的有效手段&#xff0c;已经被越来越公司采用&#xff0c;现在&#xff0c;公司里几乎任何一个岗位都会被考核&#xff0c;特别是互联网公司。今天我们以产品经理为例&#xff0c;看看这个岗位的绩效…

苍穹外卖day11笔记

今日首先介绍前端技术Apache ECharts&#xff0c;说明后端需要准备的数据&#xff0c;然后讲解具体统计功能的实现&#xff0c;包括营业额统计、用户统计、订单统计、销量排名。 一、ECharts 是什么 ECharts是一款基于 Javascript 的数据可视化图表库。我们用它来展示图表数…

leetcode每日一练-第121题-买卖股票的最佳时机

一、思路 动态规划 二、解题方法 维护两个变量&#xff1a;一个表示当前最低的股票价格 minPrice&#xff0c;另一个表示当前最大的利润 maxProfit。 遍历数组中的每个价格&#xff0c;对于每个价格&#xff0c;更新 minPrice 和 maxProfit。具体做法是&#xff0c;如果当前…

【Linux】TCP协议——传输层

目录 TCP协议 谈谈可靠性 TCP协议格式 序号与确认序号 窗口大小 六个标志位 确认应答机制&#xff08;ACK&#xff09; 超时重传机制 连接管理机制 三次握手 四次挥手 流量控制 滑动窗口 拥塞控制 延迟应答 捎带应答 面向字节流 粘包问题 TCP异常情况 TC…

【RTT驱动框架分析06】-pwn驱动框架分析+pwm驱动实现

pwm pwm应用程序开发 访问 PWM 设备API 应用程序通过 RT-Thread 提供的 PWM 设备管理接口来访问 PWM 设备硬件&#xff0c;相关接口如下所示&#xff1a; 函数描述rt_device_find()根据 PWM 设备名称查找设备获取设备句柄rt_pwm_set()设置 PWM 周期和脉冲宽度rt_pwm_enable…

橙河网络:2023年,我看谁还在做实体行业?

大家好&#xff0c;我是橙河老师&#xff0c;今天讲一讲实体行业。 现在实体行业还好干吗&#xff1f; 肯定是不好干了。 别的不扯&#xff0c;这几年很多大佬&#xff0c;能把老百姓干的事儿都干了。 一天收入上百万的演员&#xff0c;在直播间卖着九块九的东西&#xff0…

学习笔记-JVM-工具包(JVM分析工具)

常用工具 JDK工具 ① jps: JVM Process status tool&#xff1a;JVM进程状态工具&#xff0c;查看进程基本信息 ② jstat: JVM statistics monitoring tool &#xff1a; JVM统计监控工具&#xff0c;查看堆&#xff0c;GC详细信息 ③ jinfo&#xff1a;Java Configuration I…

MATLAB实现两组数据的延时对齐效果

博主在某次实验中&#xff0c;相同的实验条件下分别采集了两组数据&#xff0c;发现两组数据存在一个延时&#xff0c;如下图所示&#xff1a; 本文记录消除这个延时&#xff0c;实现相同数据状态的对齐效果&#xff0c;采用MATLAB自带的xcorr函数实现&#xff0c;具体步骤如下…

vteam透明屏,在场景化应用中,有哪些特点表现?

vteam透明屏是一种新型的显示技术&#xff0c;它采用透明材料制成&#xff0c;可以在显示内容的同时保持背景的透明度。 这种屏幕可以应用于各种领域&#xff0c;如广告、零售、展览等&#xff0c;具有很大的潜力和市场前景。 vteam透明屏的特点之一是其高透明度。与传统的显…

五、web应用程序技术——web功能

文章目录 一、服务器端功能1.1 SQL1.2 XML1.3 web服务 二、客户端功能2.1 HTML2.2 超链接2.3 表单2.4 CSS2.5 JavaScript2.6 文档对象模型2.7 Ajax2.8 JSON2.9 同源策略2.10浏览器拓展技术 一、服务器端功能 早期的web站点由各种静态资源组成&#xff0c;如HTML页面与图片。当用…

主数据管理案例-中国外运

1、 背景介绍及难点分析 作为世界领先的物流行业整合商、端到端的全程供应链解决方案和一站式物流服务提供商&#xff0c;中国外运非常重视信息化建设&#xff0c;先后投资建设了 300多个信息系统&#xff0c;为中国外运的内部管理和业务运作提供 IT 支持和保障。 由于缺乏统一…

当我准备出门时,发现了......我可以用Python实现12306自动买票

前言 不知道大家有没有之前碰到这样的情况&#xff0c;打算去某一个地方当你规划好了时间准备去买票的时候&#xff0c;你想要的那一列往往没有你想要的票了&#xff0c;尤其是国庆七天假和春节半月假&#xff0c;有时候甚至买不到规定计划时间内的票&#xff0c;真的是太烦躁…

数据分析-python学习 (1)numpy相关

内容为&#xff1a;https://juejin.cn/book/7240731597035864121的学习笔记 导包 import numpy as np numpy数组创建 创建全0数组&#xff0c;正态分布、随机数组等就不说了&#xff0c;提供了相应的方法通过已有数据创建有两种 arr1np.array([1,2,3,4,5]) 或者datanp.loadt…

vxe-grid\table 自定义动态列排序设置

实现动态加载的表格数据&#xff0c;根据设置动态控制指定的某些字段排序功能&#xff1b;如下图所示&#xff1b; 代码实现&#xff1a;标签内添加属性&#xff1b; :sort-config"{trigger:cell, defaultSort: {field: , order: desc}, orders:[desc, asc]}" sort-…

LinuxC编程——线程

目录 一、概念二、进程与线程的区别⭐⭐⭐三、线程资源四、函数接口4.1 线程创建4.2 线程退出4.3 线程回收4.3.1 阻塞回收4.3.2 非阻塞回收 4.4 pthread_create之传参4.5 练习 一、概念 是一个轻量级的进程&#xff0c;为了提高系统的性能引入线程。 进程与线程都参与cpu的统一…