【C++】string的成员函数、成员常量和非成员函数

news2024/11/18 19:43:37

目录

string

1. string的成员函数

1.1 构造、析构和赋值运算符重载

1.1.1 构造函数

1.1.2 析构函数

1.1.3 赋值运算符重载

1.2 迭代器

1.3 容量

1.4 元素访问

1.4.1 遍历方法

1.5 修改器

1.6 字符串操作

2. string的成员常量

3. string的非成员函数


string

以下函数加粗为重点。

1. string的成员函数

1.1 构造、析构和赋值运算符重载

1.1.1 构造函数

default

默认构造函数

string();构造空的string类对象,即空字符串

copy

拷贝构造函数

string(const string& str);构造一个str的拷贝

substring

string(const string& str, size_t pos, size_t len = npos);

用str中从pos开始的len个字符的子串来构造

如果str太短或者len是string::npos,则复制到str的末尾

from c-stringstring(const char* s);用C格式字符串来构造
from sequencestring(const char* s, size_t n);

用从s指向的字符串中前n个字符来构造

fillstring(size_t n, char c);用n个字符c来构造
rangetemplate <class InputIterator>   string(InputIterator first, InputIterator last);用范围[first,last]中的字符序列来构造
#include <string>
#include <iostream>

using namespace std;

int main()
{
	string s1;//default
	cout << s1 << endl;//空字符串

	string s2("hello world");//from c-string
	cout << s2 << endl;//hello world

	string s3(s2);//copy
	cout << s3 << endl;//hello world

	string s4(s3, 0, 5);//substring
	cout << s4 << endl;//hello

	string s5("hello world", 5);//from sequence
	cout << s5 << endl;//hello

	string s6(10, '*');//fill
	cout << s6 << endl;//**********

	return 0;
}

​​

1.1.2 析构函数

~string();销毁string类对象

1.1.3 赋值运算符重载

stringstring& operator=(const string& str);
c-stringstring& operator=(const char* s);
characterstring& operator=(char c);

1.2 迭代器

begin

&

end

iterator begin();
const_iterator begin() const;

iterator end();
const_iterator end() const;

begin返回一个迭代器,指向字符串的第一个字符

end返回一个迭代器,指向字符串的最后一个字符的下一个位置

rbegin

&

rend

reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

reverse_iterator rend();
const_reverse_iterator rend() const;

rbegin返回一个反向迭代器,指向字符串的最后一个字符

rend返回一个反向迭代器,指向字符串的第一个字符的上一个位置

cbegin

&

cend

const_iterator cbegin() const;
const_iterator cend() const;

cbegin返回一个const迭代器,指向字符串的第一个字符

cend返回一个const迭代器,指向字符串的最后一个字符的下一个位置

crbegin

&

crend

const_reverse_iterator crbegin() const;
const_reverse_iterator crend() const;

crbegin返回一个const反向迭代器,指向字符串的最后一个字符

crend返回一个const反向迭代器,指向字符串的第一个字符的上一个位置

begin&end和rbegin&rend返回的迭代器指向:

​​

const_iterator是一个指向const内容的迭代器。迭代器本身可以修改,但是它不能被用来修改它所指向的内容。

begin&end/rbegin&rend和cbegin&cend/crbegin&crend的不同:

  • begin&end/rbegin&rend的返回类型由对象是否是常量来决定。如果不是常量,返回iterator;如果是常量,返回const_iterator。
  • cbegin&cend/crbegin&crend的返回类型是const_iterator,不管对象本身是否是常量。
#include <string>
#include <iostream>

using namespace std;

int main()
{
	string s("hello world");

	string::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//h e l l o   w o r l d

	auto rit = s.rbegin();
	//string::reverse_iterator rit = s.rbegin();
	while (rit != s.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
	//d l r o w   o l l e h

	return 0;
}

1.3 容量

sizesize_t size() const;

返回字符串的长度

size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()

lengthsize_t length() const;返回字符串的长度
max_sizesize_t max_size() const;返回字符串能够达到的最大长度
resize

void resize(size_t n);

void resize(size_t n, char c);

调整字符串的长度为n(影响size)

·如果n<当前字符串的长度,多余的字符会被截掉

·如果n>当前字符串的长度,则:1)如果没有指定填充字符,则多出的空间用空字符填充;2)如果指定了填充字符c,则多出的空间用c填充

capacitysize_t capacity() const;返回分配的存储空间的大小
reservevoid reserve(size_t n = 0);

为字符串预留空间(影响capacity)

·如果n>当前的容量,容量增加到至少n个字符(空间大小满足16i-1)

·在所有其他情况下,它被视为缩小字符串容量的非约束性请求:容器实现可以自由地进行其他优化,并使字符串的容量大于n

clearvoid clear();清空字符串
emptybool empty() const;检测字符串是否为空串,是返回true,否则返回false
shrink_to_fitvoid shrink_to_fit();

收缩容量以适应字符串的长度

这个请求没有约束力,容器实现可以自由地进行优化,使字符串的容量大于其大小

#include <string>
#include <iostream>

using namespace std;

int main()
{
	string s("hello world");
	cout << s.size() << endl;//11
	cout << s.length() << endl;//11
	cout << s.max_size() << endl;//2147483647
	cout << s.capacity() << endl;//15

	s.resize(15, '!');
	cout << s << endl;//hello world!!!!

	s.resize(13);
	cout << s << endl;//hello world!!

	s.reserve(30);
	cout << s.capacity() << endl;//31

	s.shrink_to_fit();
	cout << s.capacity() << endl;//15

	s.clear();
	if (s.empty())
		cout << "字符串为空" << endl;
	else
		cout << "字符串不为空" << endl;
	//字符串为空

	return 0;
}

​​

1.4 元素访问

operator[]

char& operator[] (size_t pos);

const char& operator[] (size_t pos) const;

返回字符串中pos位置的字符的引用

没有越界检查

atchar& at(size_t pos);
const char& at(size_t pos) const;

返回字符串中pos位置的字符的引用

有越界检查,如果越界会抛异常

backchar& back();
const char& back() const;
返回字符串中最后一个字符的引用
frontchar& front();
const char& front() const;
返回字符串中第一个字符的引用
#include <string>
#include <iostream>

using namespace std;

int main()
{
	string s("hello world");

	cout << s[0] << endl;//h
	cout << s.at(1) << endl;//e
	cout << s.back() << endl;//d
	cout << s.front() << endl;//h

	return 0;
}

1.4.1 遍历方法

1.4.1.1 operator[](最常用)

#include <string>
#include <iostream>

using namespace std;

int main()
{
	string s("hello world");
	for (size_t i = 0; i < s.size(); i++)
	{
		cout << s[i] << " ";
	}
	cout << endl;
	//h e l l o   w o r l d
	return 0;
}

1.4.1.2 迭代器

#include <string>
#include <iostream>

using namespace std;

int main()
{
	string s("hello world");

	string::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//h e l l o   w o r l d

	auto rit = s.rbegin();
	//string::reverse_iterator rit = s.rbegin();
	while (rit != s.rend())
	{
		cout << *rit << " ";
		++rit;
	}
	cout << endl;
	//d l r o w   o l l e h

	return 0;
}

1.4.1.3 范围for

#include <string>
#include <iostream>

using namespace std;

int main()
{
	string s("hello world");

	for (auto ch : s)
	{
		cout << ch << " ";

	}
	cout << endl;
	//h e l l o   w o r l d

	return 0;
}

1.5 修改器

operator+=string& operator+=(const string& str);
string& operator+=(const char* s);
string& operator+=(char c);
字符串追加
append

string& append(const string& str);

string& append(const string& str, size_t subpos, size_t sublen);
string& append(const char* s);

string& append(const char* s, size_t n);
string& append(size_t n, char c);

template <class InputIterator>   string& append(InputIterator first, InputIterator last);

字符串追加
push_backvoid push_back(char c);尾插(追加)一个字符
assign

string& assign(const string& str);

string& assign(const string& str, size_t subpos, size_t sublen);
string& assign(const char* s);

string& assign(const char* s, size_t n);
string& append(size_t n; char c);

template <class InputIterator>   string& assign(InputIterator first, InputIterator last);

给字符串赋值,替换其当前内容
insert

string& insert(size_t pos, const string& str);
string& insert(size_t pos, const string& str, size_t subpos, size_t sublen);
string& insert(size_t pos, const char* s);
string& insert(size_t pos, const char* s, size_t n);

string& insert(size_t pos, size_t n, char c);    void insert(iterator p, size_t n, char c);
iterator insert(iterator p, char c);
template <class InputIterator>   void insert(iterator p, InputIterator first, InputIterator last);

在字符串pos位置之前插入
erasestring& erase(size_t pos = 0, size_t len = npos);
iterator erase(iterator p);
iterator erase(iterator first, iterator last);
删除字符串的一部分
replacestring& replace(size_t pos, size_t len, const string& str); string& replace(iterator i1, iterator i2, const string& str);
string& replace(size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);
string & replace(size_t pos, size_t len, const char* s); string& replace(iterator i1, iterator i2, const char* s);
string& replace(size_t pos, size_t len, const char* s, size_t n); string& replace(iterator i1, iterator i2, const char* s, size_t n);
string& replace(size_t pos, size_t len, size_t n, char c); string& replace(iterator i1, iterator i2, size_t n, char c);
template <class InputIterator>  string& replace(iterator i1, iterator i2, InputIterator first, InputIterator last);
替换字符串的一部分
swapvoid swap(string& str);交换字符串的内容
pop_backvoid pop_back();尾删
#include <string>
#include <iostream>

using namespace std;

int main()
{
	string s1("hello");
	string s2("world");

	s1 += " ";
	s1 += s2;
	s1 += '!';
	cout << s1 << endl;//hello world!

	s2.append(" peace");
	s2.append(2, '!');
	cout << s2 << endl;//world peace!!

	//尾插一个字符的3种写法
	s1 += '*';//operator+=最常用
	s1.append(1, '~');
	s2.push_back('@');
	cout << s1 << endl;//hello world!*~
	cout << s2 << endl;//world peace!!@
	
	s1.assign("I want to study.");
	cout << s1 << endl;//I want to study.

	s1.insert(15, " and play");
	cout << s1 << endl;//I want to study and play.

	s1.erase(10, 10);
	cout << s1 << endl;//I want to play.

	s1.replace(0, 1, "They");
	cout << s1 << endl;//They want to play.

	s1.swap(s2);
	cout << s1 << endl;//world peace!!@
	cout << s2 << endl;//They want to play.

	s1.pop_back();
	cout << s1 << endl;//world peace!!

	return 0;
}

​​

把"hello world i love you"中的空格替换成"%20":

#include <string>
#include <iostream>

using namespace std;

int main()
{
	string s("hello world i love you");

	/*//第1种方法 
	size_t num = 0;
	for (auto ch : s)
	{
		if (ch == ' ')
			++num;//计算有几个空格
	}
	//提前开空间,避免repalce时扩容
	s.reserve(s.size() + 2 * num);
	size_t pos = s.find(' ');//第一个空格的位置
	while (pos != string::npos)//npos是长度参数,表示直到字符串结束
	{
		s.replace(pos, 1, "%20");
		pos = s.find(' ', pos + 3);
	}
	cout << s << endl;//hello%20world%20i%20love%20you*/

	//第2种方法
	string newStr;
	size_t num = 0;
	for (auto ch : s)
	{
		if (ch == ' ')
			++num;//计算有几个空格
	}
	//提前开空间,避免repalce时扩容
	newStr.reserve(s.size() + 2 * num);
	for (auto ch : s)
	{
		if (ch != ' ')
			newStr += ch;
		else
			newStr += "%20";
	}
	s = newStr;
	cout << newStr << endl;//hello%20world%20i%20love%20you

    return 0;
}

1.6 字符串操作

c_strconst char* c_str() const;返回C格式字符串(以'\0'结尾)
dataconst char* data() const;

返回字符数组(不保证有‘\0’)

get_allocatorallocator_type get_allocator() const;返回配置器
copysize_t copy(char* s, size_t len, size_t pos = 0) const;

将对象中从pos开始的len个字符的子串复制到s指向的数组中(不会在复制内容的末尾附加'\0')

find

size_t find(const string & str, size_t pos = 0) const;
size_t find(const char* s, size_t pos = 0) const;
size_t find(const char* s, size_t pos, size_type n) const;

size_t find(char c, size_t pos = 0) const;

从对象中pos位置开始往后匹配,返回第一次出现的位置
rfindsize_t rfind(const string & str, size_t pos = npos) const;
size_t rfind(const char* s, size_t pos = npos) const;
size_t rfind(const char* s, size_t pos, size_t n) const;
size_t rfind(char c, size_t pos = npos) const;
从对象中pos位置开始往前匹配,返回第一次出现的位置
find_first_ofsize_t find_first_of(const string& str, size_t pos = 0) const;
size_t find_first_of(const char* s, size_t pos = 0) const;
size_t find_first_of(const char* s, size_t pos, size_t n) const;
size_t find_first_of(char c, size_t pos = 0) const;

从对象中pos位置开始往后匹配,返回第一个与参数中指定的任何字符相匹配的字符的位置

find_last_ofsize_t find_last_of(const string& str, size_t pos = 0) const;
size_t find_last_of(const char* s, size_t pos = 0) const;
size_t find_last_of(const char* s, size_t pos, size_t n) const;
size_t find_last_of(char c, size_t pos = 0) const;
从对象中pos位置开始往前匹配,返回第一个与参数中指定的任何字符相匹配的字符的位置
find_first_not_ofsize_t find_first_not_of(const string& str, size_t pos = 0) const;
size_t find_first_not_of(const char* s, size_t pos = 0) const;
size_t find_first_not_of(const char* s, size_t pos, size_t n) const;
size_t find_first_not_of(char c, size_t pos = 0) const;
从对象中pos位置开始往后匹配,返回第一个与参数中指定的任何字符不匹配的字符的位置
find_last_not_ofsize_t find_last_not_of(const string& str, size_t pos = 0) const;
size_t find_last_not_of(const char* s, size_t pos = 0) const;
size_t find_last_not_of(const char* s, size_t pos, size_t n) const;
size_t find_last_not_of(char c, size_t pos = 0) const;
从对象中pos位置开始往前匹配,返回第一个与参数中指定的任何字符不匹配的字符的位置
substrstring substr(size_t pos = 0, size_t len = npos) const;

返回一个从pos开始的len个字符的子串

compareint compare(const string& str) const;
int compare(size_t pos, size_t len, const string& str) const; int compare(size_t pos, size_t len, const string& str, size_t subpos, size_t sublen) const;
int compare(const char* s) const; int compare(size_t pos, size_t len, const char* s) const;
int compare(size_t pos, size_t len, const char* s, size_t n) const;

比较字符串

返回值=0,对象=比较字符串

返回值<0,对象<比较字符串

返回值>0,对象>比较字符串

#include <string>
#include <iostream>

using namespace std;

int main()
{
	string s("hello");

	cout << s.c_str() << endl;//hello
	cout << (void*)s.c_str() << endl;//地址
	cout << s.data() << endl;//hello

	char buffer[10] = { '\0' };
	s.copy(buffer, 3, 1);
	for (auto ch : buffer)
	{
		cout << ch;
	}
	cout << endl;
	//ell

	size_t pos = s.find('l');
	while (pos != string::npos)//npos是长度参数,表示直到字符串结束
	{
		s.replace(pos, 1, "L");
		pos = s.find('l', pos + 1);
	}
	cout << s << endl;
	//heLLo

	pos = s.rfind('L');
	while (pos != string::npos)
	{
		s.replace(pos, 1, "l");
		pos = s.rfind('L', pos - 1);
	}
	cout << s << endl;
	//hello

	cout << s.find_first_of("jklmn") << endl;//2

	cout << s.find_last_of("jklmn") << endl;//3

	cout << s.find_first_not_of("heL") << endl;//2

	cout << s.find_last_not_of("Lo") << endl;//3

	cout << s.substr(1, 3) << endl;//ell

	cout << s.compare("hello world") << endl;//-1

	return 0;
}

2. string的成员常量

npos为长度参数,表示直到字符串结束。

把"hello world i love you"中的空格替换成"%20":

#include <string>
#include <iostream>

using namespace std;

int main()
{
	string s("hello world i love you");

	//第1种方法
	size_t num = 0;
	for (auto ch : s)
	{
		if (ch == ' ')
			++num;//计算有几个空格
	}
	//提前开空间,避免repalce时扩容
	s.reserve(s.size() + 2 * num);
	size_t pos = s.find(' ');//第一个空格的位置
	while (pos != string::npos)//npos是长度参数,表示直到字符串结束
	{
		s.replace(pos, 1, "%20");
		pos = s.find(' ', pos + 3);
	}
	cout << s << endl;//hello%20world%20i%20love%20you

	/*//第2种方法
	string newStr;
	size_t num = 0;
	for (auto ch : s)
	{
		if (ch == ' ')
			++num;//计算有几个空格
	}
	//提前开空间,避免repalce时扩容
	newStr.reserve(s.size() + 2 * num);
	for (auto ch : s)
	{
		if (ch != ' ')
			newStr += ch;
		else
			newStr += "%20";
	}
	s = newStr;
	cout << newStr << endl;//hello%20world%20i%20love%20you*/

	return 0;
}

3. string的非成员函数

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

+运算符重载

(尽量少用,因为传值返回,导致深拷贝效率低)

relational operatorsbool operator== (const string& lhs, const string& rhs); bool operator== (const char* lhs, const string& rhs); bool operator== (const string& lhs, const char* rhs);
bool operator!= (const string& lhs, const string& rhs); bool operator!= (const char* lhs, const string& rhs); bool operator!= (const string& lhs, const char* rhs);
bool operator<  (const string& lhs, const string& rhs); bool operator<  (const char* lhs, const string& rhs); bool operator<  (const string& lhs, const char* rhs);
bool operator<= (const string& lhs, const string& rhs); bool operator<= (const char* lhs, const string& rhs); bool operator<= (const string& lhs, const char* rhs);
bool operator>  (const string& lhs, const string& rhs); bool operator>  (const char* lhs, const string& rhs); bool operator>  (const string& lhs, const char* rhs);
bool operator>= (const string& lhs, const string& rhs); bool operator>= (const char* lhs, const string& rhs); bool operator>= (const string& lhs, const char* rhs);
关系运算符重载
swapvoid swap(string& x, string& y);交换两个字符串
operator>>istream& operator>>(istream& is, string& str);>>运算符重载
operator<<ostream& operator<<(ostream& os, const string& str);<<运算符重载
getlineistream& getline(istream& is, string& str, char delim);
istream& getline(istream& is, string& str);
从流中获取一行到字符串

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

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

相关文章

javaEE 初阶 — 应用层中的 DNS 协议(域名解析系统)

文章目录什么是域名1. 如何建立 域名 与 IP 的对应关系2. 域名的分级什么是域名 域名也就是平常所说的网址&#xff0c;比如 www.baidu.com。 其实网络上的服务器要访问这个网址&#xff0c;需要的是 IP 地址。、 但是 IP 地址比较拗口不方便记忆&#xff0c;于是就有使用一些…

单向非循环链表

1、顺序表遗留问题 1. 中间/头部的插入删除&#xff0c;时间复杂度为O(N) 2. 增容需要申请新空间&#xff0c;使用malloc、realloc等函数拷贝数据&#xff0c;释放旧空间。会有不小的消耗。 3. 当我们以2倍速度增容时&#xff0c;势必会有一定的空间浪费。例如当前容量为100&a…

IDEA这些配置,简单高效

优化导包配置配置路径&#xff1a;File-> settings -> Editor -> General -> Auto ImportAdd unambiguous imports on the fly&#xff1a;自动导包Optimize imports on th fly (for current project)&#xff1a;自动删除无用包代码提示取消大小写配置路径&#x…

AOP(概念和原理)

文章目录1. AOP&#xff08;概念&#xff09;2. AOP&#xff08;底层原理&#xff09;2.1 AOP底层使用动态代理&#xff08;两种&#xff09;2.2 AOP 底层使用哪种代理方式 &#xff1f;3. AOP相关概念3.1 AOP术语4. AOP操作4.1 基于AspectJ实现AOP操作4.2 切点表达式4.3 基于A…

6 分布式事务简介

分布式事务简介 概念 基础概念&#xff1a;事务ACID * A&#xff08;Atomic&#xff09;&#xff1a;原子性&#xff0c;构成事务的所有操作&#xff0c;要么都执行完成&#xff0c;要么全部不执行&#xff0c;不可能出现部分成功部分失 败的情况。 * C&#xff08;Consisten…

嵌入式和Python(一):python环境搭建的详细步骤

目录 ● 安装python ① 更新软件列表 ② 安装编译python需要用到的环境 ③ 下载python源码 ④ 解压源码包 ⑤ 配置 ⑥ 编译 ⑦ 安装 ● 建立软连接 说明 ① 删除原来的软连接 ② 在/usr/bin/目录创建软连接python&#xff0c;定向/usr/local/bin/python3.9 ③ 检查…

Java面向对象:多态特性的学习

本文介绍了Java面向对象多态特性, 多态的介绍. 多态的实现条件–1.发生继承.2.发生重写(重写与重载的区别)3.向上转型与向下转型.4.静态绑定和动态绑定5. 实现多态 举例总结多态的优缺点 避免在构造方法内调用被重写的方法… Java面向对象:多态特性的学习一.什么是多态?二.多态…

MATLAB | 如何将colormap中心点置为0值处?

本期讲有一些绘图时正负部分需要分开赋予颜色&#xff0c;这时候双向colormap的中心对应的可能并不是数值0&#xff0c;该咋办&#xff0c;就比如下面的情况&#xff1a; 事先说明&#xff0c;为了绘图好看&#xff0c;本文中全部示例都在代码最后用了以下这个简单函数进行修饰…

库到底是个啥?为啥要链接,链接库的本质又是个啥?

目录 前言 一、库是个啥&#xff1f; ①最开始的库是用来解决啥问题&#xff1f; ②库的基本构成 ③动态库与静态库 二、如何生成库 0、相关知识 ①生成静态库 ②生成动态库 三、库的使用 ①修改环境变量 ②拷贝.so文件到系统共享库路径下, 一般指/usr/lib ③ldconfig 配置/etc…

安卓逆向_6 --- JNI 和 NDK

Java 本机接口规范内容&#xff1a;https://docs.oracle.com/en/java/javase/19/docs/specs/jni/index.html JNI官方中文资料&#xff1a;https://blog.csdn.net/yishifu/article/details/52180448 NDK 官方文档&#xff1a;https://developer.android.google.cn/training/ar…

【Python学习笔记】第二十八节 Python random 模块

一、Python random简介Python random 模块主要用于生成随机数。大部分python人都会用&#xff0c;但是一般人都是使用randint()帮我们生成某个范围的整数&#xff0c;但其实random模块还有很多非常使用的功能供我们使用&#xff0c;接下来我们就一一了解一下我们的random。要使…

JavaWeb系列之tomcat 服务器安装

文章目录一、JavaWeb应用程序架构B/S 架构C/S 架构B/S 与 C/S 对比MVC设计模式二、MVCMVC 开发项目搭建Web 服务器tomcat 服务器Idea 集成 tomcat第一个 JavaWeb 项目三、JSP 技术jsp 与 servlet 联系与区别一、JavaWeb 简介 JavaWeb 可以理解成使用 java 进行应用程序开发&am…

Windows-jdk8/jdk16安装

Windows-JAVA jdk-8安装教程 下载地址 百度网盘 提取码&#xff1a;Chen 官网 安装jdk8 双击打开下载的安装包 点击下一步 更改安装目录 点击下一步 修改Java安装目录 点击下一步 完成 配置环境变量 按住WindowsR 打开运行窗口 输入 sysdm.cpl 打开系统属性——》高级—…

华为机试题:HJ102 字符统计(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

【Redis】Redis分片集群

【Redis】Redis分片集群 文章目录【Redis】Redis分片集群1. 搭建分片集群1.1 分片集群结构1.2 搭建分片集群1.2.1 集群结构1.2.2 准备实例和配置1.2.3 启动1.2.4 创建集群1.2.5 测试2. 散列插槽2.1 总结3. 集群伸缩4. 故障转移4.1 数据迁移5. RedisTemplate访问分片集群1. 搭建…

GEE开发之ERA5(气温、降水、压力、风速等)数据获取和分析

GEE开发之ERA5&#xff08;气温、降水、压力、风速等&#xff09;数据获取和分析1.ERA5介绍2.初始ERA5数据2.1 DAILY代码2.2 MONTHLY代码3.遥感影像查看&#xff08;DAILY之mean_2m_air_temperature&#xff09;4.逐日数据分析和获取(以mean_2m_air_temperature为例)5.逐月数据…

【Storm】【二】Storm和流处理简介

Storm和流处理简介 一、Storm1.1 简介1.2 Storm 与 Hadoop对比1.3 Storm 与 Spark Streaming对比1.4 Storm 与 Flink对比二、流处理2.1 静态数据处理2.2 流处理一、Storm 1.1 简介 Storm 是一个开源的分布式实时计算框架&#xff0c;可以以简单、可靠的方式进行大数据流的处理…

基于 explore_lite包 的单个机器人自主探索建图

文章目录一、简介二、安装 explore_lite三、launch 文件配置四、实验效果五、常见问题机器人自主建图有很多方式&#xff0c;比如基于位置边界的map-explore&#xff0c;基于快速搜索树的rrt-explore&#xff0c;指定区域自主探索建图frontier-explore&#xff0c;这几种方法各…

SQL速查

学习自C语言中文网SQL教程笔记&#xff0c;该笔记为速查笔记&#xff0c;学习还是看原教程文章&#xff1a;http://c.biancheng.net/sql/ SQL命令 SQL 是关系型数据库的标准语言&#xff0c;SQL关键字不区分大小写 SQL语句分为以下三种类型&#xff1a; DML: Data Manipulat…

中国不缺高端产品,缺的只是高端服务

作者 | 曾响铃 文 | 响铃说 最近&#xff0c;响铃受邀参加了讯飞智能办公本莫比俱乐部在广州举办的用户研学活动&#xff0c;感触颇多。 为什么会有这趟经历&#xff1f;说来也巧&#xff0c;前段时间因为开会需要入手了讯飞智能办公本X2&#xff0c;成了他们的用户&#xf…