C++——解锁string常用接口

news2024/12/25 0:55:16

本篇的内容是记录使用string接口的测试与使用,方便后续使用时查阅使用

首先介绍

string::npos;

size_t(无符号整型)的最大值。NPOS 是一个静态成员常量值,具有 size_t 类型元素的最大可能值。当此值用作字符串成员函数中 len(或 sublen)参数的值时,表示“直到字符串末尾”。作为返回值,它通常用于指示不匹配。此常量使用值 -1 定义,由于 size_t 是无符号整数类型,因此它是此类型的最大可能可表示值。

引用头文件和展开命名空间
 

#include<iostream>
#include<string>
using namespace

1.测试string容量相关的接口:

1.1 string::size()

size_t size() const;
字符串的返回长度

返回字符串的长度(以字节为单位)。

这是符合字符串内容的实际字节数,不包括'\0',不一定等于其存储容量。


请注意,对象在处理字节时不知道最终可能用于对其包含的字符进行编码的编码。因此,返回的值可能与多字节或可变长度字符序列(如 UTF-8)中编码字符的实际数目不对应。string::size 和 string::length 都是同义词,返回相同的值。
string

// string::size
#include <iostream>
#include <string>

int main ()
{
  std::string str ("Test string");
  std::cout << "The size of str is " << str.size() << " bytes.\n";
  return 0;
}

输出:

The size of str is 11 bytes

1.2 string::clear()

void clear();
清除字符串

擦除字符串的内容,该字符串将变为空字符串(长度为 0 个字符)。

其实就是将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小

1.3 string::resize()

void resize (size_t n);
void resize (size_t n, char c);●  如果 n 小于当前字符串长度,则当前值将缩短为其前 n 个字符,并删除第 n 个字符以外的字符。
●  如果 n 大于当前字符串长度,则通过在末尾插入任意数量的字符来扩展当前内容,以达到 n 的大小。
●  如果指定了 c,则新元素将初始化为 c 的副本,否则,它们是值初始化的字符(null 字符)
void Teststring1()
{
	// 注意:string类对象支持直接用cin和cout进行输入和输出
	string s("hello, zjc!!!");
	cout << s.size() << endl;
	cout << s.length() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;

	// 将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小
	s.clear();
	cout << s.size() << endl;
	cout << s.capacity() << endl;

	// 将s中有效字符个数增加到10个,多出位置用'a'进行填充
	// “aaaaaaaaaa”
	s.resize(10, 'a');
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	
	//将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充
	//”aaaaaaaaaaa\0\0“
	//注意此时s中有效个数已经增加到15个
	s.resize(15);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;
	
	//将s中有效数字符缩小到5个
	s.resize(5);
	cout << s.size() << endl;
	cout << s.capacity() <<endl;
	cout << s << endl;
	
} 

 1.4 string::erase()

erase()函数用于从字符串中删除指定位置或指定范围的字符。它可以接受一个参数或两个参数。
1.当传递一个参数时,表示从指定位置开始删除到字符串的末尾的所有字符。
2.当传递两个参数时,表示从指定位置开始删除指定数量的字符。
3.l调用erase()后,字符串的长度会相应地减少,并且内存空间也可能会被重新分配以适应新的长度。
 

void Teststring2() 
{
    //clear()函数用于清空字符串的内容,将字符串变为空字符串,即不包含任何字符。
    //调用clear()后,字符串的长度将变为0,但内存空间不会被释放,仍然保留着。
    string s1("hello wolrd"); 
    s1.clear();
    cout << "s1: " << s1 <<endl;
    cout << s1.size()<<endl<< s1.capacity()<<endl;
    //erase()函数用于从字符串中删除指定位置或指定范围的字符。它可以接受一个参数或两个参数。
    //当传递一个参数时,表示从指定位置开始删除到字符串的末尾的所有字符。
    string s2("hello wolrd");
    s2.erase(4);
    cout << "s2: " << s2 <<endl;
    cout << s2.size()<<endl<< s2.capacity()<<endl; 
    //当传递两个参数时,表示从指定位置开始删除指定数量的字符。
    //调用erase()后,字符串的长度会相应地减少,并且内存空间也可能会被重新分配以适应新的长度。
    string s3("hello wolrd");
    s3.erase(7,3);
    cout << "s3: " << s3 <<endl;
    cout << s3.size()<<endl<< s3.capacity();
}

1.5 string::reserve() 保留

void reserve (size_t n = 0);
请求更改容量

请求使字符串容量适应计划的大小更改,长度不超过 n 个字符。

如果 n 大于当前字符串容量,则该函数会导致容器将其容量增加到 n 个字符(或更大(具体看编译器的设定))。

在所有其他情况下,它被视为收缩字符串容量的非绑定请求(在size大于n的情况下,请求缩小容积无效):容器实现可以自由地优化,并使字符串的容量大于 n

此函数对字符串长度没有影响,并且无法更改其内容。

void Teststring3()
{

    string s;
    //测试reserve是否改变string中有效元素个数
    s.reserve(100);
    cout << s.size()<<endl;
    cout << s.capacity() <<endl;
    
    // 测试reserve参数小于string的底层空间大小,是否会将空间缩小
    s.reserve(50);
    cout << s.size()<<endl;
    cout << s.capacity() <<endl;
    //可以缩小空间 

}

1.6 std::string::shrink_to_fit

void shrink_to_fit();
收缩以适合

请求字符串减小其容量以适合其大小。
可以理解为请求string::size() 缩小后。为了缩小占有空间,使用shrink_to_fit()缩小,

此时string::size()不变。string::capacity可能会缩小有可能不变,如果string::capacity缩小,那么一定大于等于string::size。

例:

// string::shrink_to_fit
#include <iostream>
#include <string>

int main ()
{
  std::string str (100,'x');
  std::cout << "1. capacity of str: " << str.capacity() << '\n';

  str.resize(10);
  std::cout << "2. capacity of str: " << str.capacity() << '\n';

  str.shrink_to_fit();
  std::cout << "3. capacity of str: " << str.capacity() << '\n';

  return 0;
}

可能的输出:

1. capacity of str: 100
2. capacity of str: 100
3. capacity of str: 10

2.string数据插入删除相关的接口

2.1 std::string::push_back 尾插

void push_back (char c);
将字符附加到字符串

将字符 c 追加到字符串的末尾,使其长度增加 1。

// string::push_back
#include <iostream>
#include <fstream>
#include <string>

int main ()
{
  std::string str1("hello world");
  std::string str2;
  for(auto e:str1)
  {
      str2.push_back(e);
  }
  std::cout << str2 << '\n';
  return 0;
}

将字符串str1的字符从前到后尾插到str2中

2.2 std::string::pop_back 尾删

void pop_back();
删除最后一个字符

擦除字符串的最后一个字符,从而有效地将其长度减少 1。

#include <iostream>
#include <string>

int main ()
{
  std::string str1("hello world");
  std::string str2;
  for(auto e:str1)
  {
      str2.push_back(e);
  }
  std::cout << str2 << '\n';
  str2.pop_back();
  str2.pop_back();
  std::cout << str2 << '\n';
  return 0;
}

直接调用两次pop_back函数,删掉尾部两个字符。

2.3 std::string::insert 插入

这里我们

字符串 (1)
 string& insert (size_t pos, const string& str);
子字符串 (2)
 string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
C -string (3)
 string& insert (size_t pos, const char* s);
 buffer(4)
 string& insert (size_t pos, const char* s, size_t n);
 fill(5)
 string& insert (size_t pos, size_t n, char c);
    void insert (iterator p, size_t n, char c);
char (6)
iterator insert (iterator p, char c);
range (7)
template <class InputIterator>
   void insert (iterator p, InputIterator first, InputIterator last);

这里我们主要用到1235这三个重载函数。

// inserting into a string
#include <iostream>
#include <string>

int main ()
{
  std::string str="to be question";
  std::string str2="the ";
  std::string str3="or not to be";
  std::string::iterator it;

  // used in the same order as described above:
  str.insert(6,str2);                 // to be (the )question
  str.insert(6,str3,3,4);             // to be (not )the question
  str.insert(10,"that is cool",8);    // to be not (that is )the question
  str.insert(10,"to be ");            // to be not (to be )that is the question
  str.insert(15,1,':');               // to be not to be(:) that is the question
  it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question
  str.insert (str.end(),3,'.');       // to be, not to be: that is the question(...)
  str.insert (it+2,str3.begin(),str3.begin()+3); // (or )

  std::cout << str << '\n';
  return 0;
}

3.string查找相关的接口

3.1 std::string::find

字符串 (1)	
size_t find (const string& str, size_t pos = 0) const;
C string (2)	
size_t find (const char* s, size_t pos = 0) const;
缓冲器 (3)	
size_t find (const char* s, size_t pos, size_t n) const;
字符 (4)	
size_t find (char c, size_t pos = 0) const;
在字符串中查找内容

在字符串中搜索由其参数指定的序列的第一次匹配项,并返回第一个匹配项所在的第一个字符的位置。
指定 pos 时,搜索仅包括位置 pos 处或位置之后的字符,忽略任何可能出现的在 pos 之前包含字符的情况。
请注意,与成员find_first_of不同,每当搜索多个字符时,仅其中一个字符匹配是不够的,但整个(所搜索)序列必须匹配。

参数

str

另一个包含要搜索的主题的字符串。

POS

要在搜索中考虑的字符串中第一个字符的位置。
如果这大于字符串长度,则函数永远不会找到匹配项。
注意:第一个字符由值 0(不是 1)表示:值 0 表示搜索整个字符串。

s

指向字符数组的指针。
如果指定了参数 n (3),则要匹配的序列是数组中的前 n 个字符。
否则 (2),应为以 null 结尾的序列:要匹配的序列的长度由第一次出现 null 字符确定。

n

要匹配的字符序列的长度。

c

要搜索的单个字符

size_t 是无符号整型(与成员类型相同)。string::size_type

 

返回值

第一个匹配项的第一个字符的位置。
如果未找到匹配项,该函数将返回 string::npos。

void Teststring6()
{	
	//取出ur1中的域名
	string ur1("http://www.cplusplus.com/reference/string/string/find/");
	cout << ur1 << endl;
	size_t start = 0;
	size_t finish = ur1.find("://");
	if(start == string::npos)
	{
		cout << "invalid ur1" << endl;
		return;
	}
	// string substr (size_t pos = 0, size_t len = npos) const;
	string address = ur1.substr(start,finish - start);
	cout << address << ' ';
	start += address.size()+3;
	do
	{
		finish = ur1.find('/',start); 
		address = ur1.substr(start,finish - start);
		cout << address << ' '; 
		start += address.size()+1;
	}while(finish!= (ur1.size()-1));
	cout << endl;
	
	// 删除ur1的协议前缀
	pos = ur1.find("://");
	ur1.erase(0, pos + 3);
	cout << ur1 <<endl; 
}

使用find寻找C++图书馆网站的网址中://和/,来区分协议,域名等的。

string::size_type

3.2 std::string::rfind

std::string::rfind
string (1)
size_t rfind (const string& str, size_t pos = npos) const;
c-string (2)
size_t rfind (const char* s, size_t pos = npos) const;
buffer (3)
size_t rfind (const char* s, size_t pos, size_t n) const;
character (4)
size_t rfind (char c, size_t pos = npos) const;
查找字符串中最后一次出现的内容

在字符串中搜索由其参数指定的序列的最后一次匹配项。

指定 pos 时,搜索仅包括从位置 pos 开始或之前开始的字符序列,忽略在 pos 之后开始的任何可能的匹配。

这个与string::find类似,不过最大的区别是一个从前往后搜索,另一个从后往前搜索。

// string::rfind
#include <iostream>
#include <string>
#include <cstddef>

int main ()
{
  std::string str ("The sixth sick sheik's sixth sheep's sick.");
  std::string key ("sixth");

  std::size_t found = str.rfind(key);
  if (found!=std::string::npos)
    str.replace (found,key.length(),"seventh");

  std::cout << str << '\n';

  return 0;
}

这代码搜索sixth,并且替换成seventh,可以看到它是替换掉后面sixth而不是前面的sixth,可以证明该函数是从前后往前搜索的。

输出

The sixth sick sheik's seventh sheep's sick

string::find_first_of

string::find_first_not_of

string::find_last_of

string::find_list_not_of

这四个接口十分类似,这里不一一列举,主要讲解string::find_first_of,其他简单介绍。

3.3string::find_first_of

字符串 (1)
size_t find_first_of (const string& str, size_t pos = 0) const;
C 弦 (2)
size_t find_first_of (const char* s, size_t pos = 0) const;
缓冲器 (3)
size_t find_first_of (const char* s, size_t pos, size_t n) const;
字符 (4)
size_t find_first_of (char c, size_t pos = 0) const;
在字符串中查找字符

在字符串中搜索与其参数中指定的任何字符匹配的第一个字符。
指定 pos 时,搜索仅包括位置 pos 处或位置之后的字符,忽略 pos 之前可能出现的任何字符。

参数

str

另一个包含要搜索的字符的字符串。

POS

要在搜索中考虑的字符串中第一个字符的位置。
如果这大于字符串长度,则函数永远不会找到匹配项。
注意:第一个字符由值 0(不是 1)表示:值 0 表示搜索整个字符串。

s

指向字符数组的指针。
如果指定了参数 n (3),则搜索数组中的前 n 个字符。
否则 (2),应为以 null 结尾的序列:包含要匹配的字符的序列的长度由第一次出现 null 字符确定。

n

要搜索的字符值数。

c

要搜索的单个字符。


size_t是无符号整型(与成员类型相同)。string::size_type

string::size_type

返回值

匹配的第一个字符的位置。
如果未找到匹配项,该函数将返回 string::npos。

代码演示

// string::find_first_of
#include <iostream>       // std::cout
#include <string>         // std::string
#include <cstddef>        // std::size_t

int main ()
{
  std::string str ("Please, replace the vowels in this sentence by asterisks.");
  std::size_t found = str.find_first_of("aeiou");
  while (found!=std::string::npos)
  {
    str[found]='*';
    found=str.find_first_of("aeiou",found+1);
  }

  std::cout << str << '\n';

  return 0;
}

找到任何字符匹配的第一个字符,即是字符串中“aeiou”的任意一个字符匹配,就把它替换成

‘*’。

输出

Pl**s*, r*pl*c* th* v*w*ls *n th*s s*nt*nc* by *st*r*sks.

3.4 string::find_first_not_of

接口参数和string::find_first_of一样,但是查找的是字符串中缺少字符(没有出现的字符),返回它的位置。

3.5 string::find_last_of

接口参数和string::find_first_of一样,查找的是字符串中字符,返回它的位置,与string::find_first_of不同的是从后往前寻找。

3.6 string::find_last_not_of

接口参数和string::find_first_of一样,与  string::find_last_of类似但是查找的是字符串中缺少字符(没有出现的字符)。

4.string的遍历(含迭代器接口)

    3种遍历方式:
    需要注意的以下三种方式除了遍历string对象,还可以遍历修改string中的字符,
    另外以下三种方式对于string而言,第一种使用最多

void Teststring5()
{
    string s("hello world");
    //1.for + operator[]
    for(size_t i = 0; i< s.size();++i)
        cout << s[i] <<" ";
    cout << endl;
    
    //2.迭代器
    string::iterator it = s.begin();
    while(it != s.end())
    {
        cout << *it << " ";
        ++it; 
    }
    cout << endl; 
    
    // string::reverse_iterator = s.rbegin();
    //C++11之后。直接使用auto定义迭代器,让编译器推导迭代器的类型
    auto rit = s.rbegin();    
    while(rit != s.rend())
    {
        cout << *rit << endl;
        rit++;
    }    
    //3.范围for(底层也是运用迭代器)
    for(auto ch : s) //如果要修改的话,使用引用 
        cout << ch << " ";
    cout << endl; 
} 

4.1 std::string::begin

      iterator end();
const_iterator end() const;
将迭代器返回到开头

返回指向字符串的第一个字符的迭代器。(运用如上代码所示)

4.2 std::string::end

     iterator end();
const_iterator end() const;
将迭代器返回到 end

返回一个迭代器,该迭代器指向字符串的末尾字符。(运用如上代码所示)
过去结束字符是理论上的字符,它将跟随字符串中的最后一个字符。不得取消引用。
由于标准库的函数使用的范围不包括其关闭迭代器所指向的元素,因此此函数通常与 string::begin 结合使用,以指定包含字符串中所有字符的范围。
如果对象是空字符串,则此函数返回与 string::begin 相同的结果。

4.3 std::string::rbegin

      reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
返回反向迭代器以反向开始

返回指向字符串最后一个字符(即其反向开头)的反向迭代器
反向迭代器向后迭代:增加它们会使它们向字符串的开头移动。
rbegin 指向 member end 将指向的字符之前的字符。(运用如上代码所示)


4.4 std::string::rend

      reverse_iterator rend();
const_reverse_iterator rend() const;
将反向迭代器返回到反向端

返回一个反向迭代器,该迭代器指向字符串第一个字符(被视为其反向末尾)之前的理论元素。
string::rbegin 和 string::rend 之间的范围包含字符串的所有字符(顺序相反)。

(运用如上代码所示)

5. string 子字符串

5.1 std::string::substr

string substr (size_t pos = 0, size_t len = npos) const;

生成子字符串
返回一个新构造的对象,其值初始化为此对象的子字符串的副本。子字符串是对象的一部分,它从字符位置开始并跨越字符(或直到字符串的末尾,以先到者为准)。

pos

要作为子字符串复制的第一个字符的位置。
如果这等于字符串长度,则该函数返回一个空字符串
如果这大于字符串长度,则会抛出out_of_range。
注意:第一个字符由值 0(而不是 1)表示。

lens

要包含在子字符串中的字符数(如果字符串较短,则使用尽可能多的字符)。
值 string::npos 表示字符串末尾之前的所有字符。

返回值

一个字符串对象,具有此对象的子字符串。

// string::substr
#include <iostream>
#include <string>

int main ()
{
  std::string str="We think in generalities, but we live in details.";
                                           // (quoting Alfred N. Whitehead)

  std::string str2 = str.substr (3,5);     // "think"

  std::size_t pos = str.find("live");      // position of "live" in str

  std::string str3 = str.substr (pos);     // get from "live" to the end

  std::cout << str2 << ' ' << str3 << '\n';

  return 0;
}

输出

think live in details.

演示了加lens和不加lens的情况

6.交换和替换string接口

6.1 std::string::replace

string (1)	
string& replace (size_t pos,  size_t len,  const string& str);
string& replace (iterator i1, iterator i2, const string& str);
substring (2)	
string& replace (size_t pos,  size_t len,  const string& str,
                 size_t subpos, size_t sublen);
C string (3)	
string& replace (size_t pos,  size_t len,  const char* s);
string& replace (iterator i1, iterator i2, const char* s);
缓冲器 (4)	
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);
full (5)	
string& replace (size_t pos,  size_t len,  size_t n, char c);
string& replace (iterator i1, iterator i2, size_t n, char c);
range (6)	
template <class InputIterator>
  string& replace (iterator i1, iterator i2,
                   InputIterator first, InputIterator last);

主要用到前四个接口。

很简单的概括就是前面规划出要被替换的字符串和后面规划出要替换的字符串。

参数

pos

原来字符串位置

len

要替换的长度

例子 

#include <iostream>
#include <string>

int main ()
{
  std::string base="this is a test string.";
  std::string str2="n example";
  std::string str3="sample phrase";
  std::string str4="useful.";

  // replace signatures used in the same order as described above:

  // Using positions:                 0123456789*123456789*12345
  std::string str=base;           // "this is a test string."
  str.replace(9,5,str2);          // "this is an example string." (1)
  str.replace(19,6,str3,7,6);     // "this is an example phrase." (2)
  str.replace(8,10,"just a");     // "this is just a phrase."     (3)
  str.replace(8,6,"a shorty",7);  // "this is a short phrase."    (4)
  str.replace(22,1,3,'!');        // "this is a short phrase!!!"  (5)

  // Using iterators:                                               0123456789*123456789*
  str.replace(str.begin(),str.end()-3,str3);                    // "sample phrase!!!"      (1)
  str.replace(str.begin(),str.begin()+6,"replace");             // "replace phrase!!!"     (3)
  str.replace(str.begin()+8,str.begin()+14,"is coolness",7);    // "replace is cool!!!"    (4)
  str.replace(str.begin()+12,str.end()-4,4,'o');                // "replace is cooool!!!"  (5)
  str.replace(str.begin()+11,str.end(),str4.begin(),str4.end());// "replace is useful."    (6)
  std::cout << str << '\n';
  return 0;
}

7.比较赋值string接口

直接运用>、<、<=、>=、!=、==、运算比较即可

库函数已经进行运算符重载就不需要用类似string::compare()的接口增加记忆成本

#include <iostream>
#include <string>
using namespace std; 
int main ()
{
 
    string str1("string");
    string str2("string1");
    string str3("string1");
    cout << (str1 < str2) <<endl;
    cout << (str1 == str2) <<endl;
    cout << (str1 > str2) <<endl;
    cout << (str3 < str2) <<endl;
    cout << (str3 == str2) <<endl;
    cout << (str3 > str2) <<endl;

}

输出:

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

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

相关文章

希宝猫罐头怎么样?专业人士告诉你性价比高的猫罐头推荐

作为一家经营猫咖店已有6年的店长&#xff0c;我在这段时间里接触过不少于30种不同的猫罐头。在猫罐头上我还是有话语权的。通过本文&#xff0c;我将与大家分享值得购买的猫罐头&#xff0c;分享猫罐头喂养的技巧。那么希宝猫罐头表现怎么样呢&#xff1f; 希宝猫罐头可是采用…

Python GUI 图形用户界面程序设计,Python自带 tkinter 库

文章目录 前言GUI介绍简单操作tkinter组件介绍向窗体中添加按钮控件使用文本框控件使用菜单控件使用标签控件使用单选按钮和复选按钮组件使用绘图组件关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集…

【多线程】-- 04 静态代理模式

多线程 3 静态代理 这里以一个现实生活中的例子来解释并实现所谓的静态代理模式&#xff0c;即结婚者雇用婚庆公司来帮助自己完成整个婚礼过程&#xff1a; package com.duo.lambda;interface Marry {void HappyMarry();//人生四大乐事&#xff1a;久旱逢甘霖&#xff1b;他…

自动化测试|我为什么从Cypress转到了Playwright?

以下为作者观点&#xff1a; 早在2019年&#xff0c;我就开始使用Cypress &#xff0c;当时我所在的公司决定在新项目中放弃Protractor 。当时&#xff0c;我使用的框架是Angular&#xff0c;并且有机会实施Cypress PoC。最近&#xff0c;我换了工作&#xff0c;现在正在使用R…

springboot自定义更换启动banner动画

springboot自定义更换启动banner动画 文章目录 springboot自定义更换启动banner动画 &#x1f4d5;1.新建banner&#x1f5a5;️2.启动项目&#x1f516;3.自动生成工具&#x1f9e3;4.彩蛋 &#x1f58a;️最后总结 &#x1f4d5;1.新建banner 在resources中新建banner.txt文…

C#——多线程之异步调用容易出现的问题

C#——多线程之异步调用容易出现的问题 Q1&#xff1a;For中异步调用函数且函数输入具有实时性 Q1&#xff1a;For中异步调用函数且函数输入具有实时性 在项目进行过程中&#xff0c;发现For中用异步调用带有输入参数的函数时&#xff0c;会由于闭包特性&#xff0c;以及Task.…

ssm+vue的公司安全生产考试系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的公司安全生产考试系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

C#从零搭建微信机器人(二)分词匹配组件【jieba】的使用

上篇文章我们讲解了微信机器人的环境搭建及演示&#xff0c;这期我们来说一下其中在模糊匹配搜索时用到的Segement子项目&#xff0c;也就是其中的中文分词匹配器。 一、原理介绍&#xff1a; 其实这个子项目中的分词插件和solr的IK分词器类似&#xff0c;都是可以支持将一句…

TP4066L是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。

TP4066L 采用ESOP8/DFN2*2-8封装 1A线性锂离子电池充电器 描述&#xff1a; TP4066L是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。其底部带有散热片的ESOP8DFN2*2-8封装与较少的外部元件数目使得TP4066L成为便携式应用的理想选择。TP4066L可以适合USB电源和适…

桐庐县数据资源管理局领导一行莅临美创科技并带来感谢信

11月23日&#xff0c;浙江桐庐县数据资源管理局党组成员、副局长朱勃一行到访美创科技总部参观交流&#xff0c;并带来感谢信&#xff0c;对美创圆满完成护航亚运政务外网数据网站安全保障工作表示充分肯定。美创科技联合创始人、副总裁胡江涛等进行热情接待并开展交流座谈。 图…

微信ipad协议8.0.37/8.0.40新版本

功能如下&#xff0c;如有定制功能请在官网联系我们。 登录 创建新设备 获取登录er维码 执行登录 注销登录 消息 消息回调 消息撤回 发送app类型消息 发送小程序 发送CDN文件 发送CDN图片 发送CDN视频 发送emoji 发送文件 发送图片 发送链接 发送消息 发送视频 发送语音 …

2021年全国a级景区数据,shp+csv数据均有

大家好~这周将和大家分享关于文化旅游和城乡建设相关的数据&#xff0c;希望大家喜欢~ 今天分享的是2021年全国a级景区数据&#xff0c;数据格式有shpcsv&#xff0c;几何类型为点&#xff0c;已经经过清洗加工&#xff0c;可直接使用&#xff0c;以下为部分字段列表&#xff…

无人机遥控器方案定制_MTK平台无人设备手持遥控终端PCB板开发

随着科技的不断发展和无人机技术的逐步成熟&#xff0c;无人机越来越受到人们的关注。作为一种高新技术&#xff0c;无人机的应用范围不断拓展&#xff0c;包括农业、环境监测、城市规划、运输物流等领域。同时&#xff0c;无人机的飞行控制技术也得到了不断的优化和提升。 早…

前端管理制度

数据运营中心的管理形式&#xff1a; 数据运营中心的管理形式 竖向是各小组 横向是项目管理 负责人的定位&#xff1a; 只是工作的内容不同&#xff0c;没有上下级之分 帮助组员找到适合的位置&#xff0c;帮助大家解决问题&#xff0c;给大家提供资源 前端组的工作形式&am…

Doris-Routine Load(二十七)

例行导入&#xff08;Routine Load&#xff09;功能为用户提供了一种自动从指定数据源进行数据导入的功能。 适用场景 当前仅支持从 Kafka 系统进行例行导入&#xff0c;使用限制&#xff1a; &#xff08;1&#xff09;支持无认证的 Kafka 访问&#xff0c;以及通过 SSL 方…

二维码智慧门牌管理系统:实现高效信息管理

文章目录 前言一、 功能升级优势 前言 随着科技的飞速发展和人们生活节奏的加快&#xff0c;传统的门牌管理系统已经不再适应现代社会的需求。为了解决这一问题&#xff0c;全新的二维码智慧门牌管理系统升级解决方案应运而生&#xff0c;为用户带来前所未有的便捷与高效。 一…

1m照片手机怎么拍?一分钟解决!

我们都知道现在的手机像素特别好&#xff0c;随便拍一张照片都是2-3MB&#xff0c;有时候上课或者会议要拍很多照片&#xff0c;这些照片其实又不需要如此清晰&#xff0c;就会特别占内存&#xff0c;下面就向大家介绍三种好用的办法。 方法一&#xff1a;拍完照后手机截图进行…

【开源】基于JAVA的海南旅游景点推荐系统

项目编号&#xff1a; S 023 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S023&#xff0c;文末获取源码。} 项目编号&#xff1a;S023&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四…

训练 CNN 对 CIFAR-10 数据中的图像进行分类

1. 加载 CIFAR-10 数据库 import keras from keras.datasets import cifar10# 加载预先处理的训练数据和测试数据 (x_train, y_train), (x_test, y_test) cifar10.load_data() 2. 可视化前 24 个训练图像 import numpy as np import matplotlib.pyplot as plt %matplotlib …

【Java开发基础】intellij IDEA快速配置JDBC驱动连接MySQL数据库并查询数据,其实真的很简单,我5分钟就学会了!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起学习和进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&a…