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

本篇的内容是记录使用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 )questionstr.insert(6,str3,3,4);             // to be (not )the questionstr.insert(10,"that is cool",8);    // to be not (that is )the questionstr.insert(10,"to be ");            // to be not (to be )that is the questionstr.insert(15,1,':');               // to be not to be(:) that is the questionit = str.insert(str.begin()+5,','); // to be(,) not to be: that is the questionstr.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_tint 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 strstd::string str3 = str.substr (pos);     // get from "live" to the endstd::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*12345std::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.mzph.cn/news/174202.shtml

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

相关文章

Linux多路转接select,poll

文章目录 目录 文章目录 一、五种IO模型 1.阻塞IO: 2.非阻塞IO 3.信号驱动IO 4.IO多路转接 5.异步IO 二、高级IO的一些重要概念 1.同步通信和异步通信 2.阻塞和非阻塞 三、其他高级IO 四、非阻塞IO 1.fctl函数 2.实现setNoBlock函数&#xff0c;将文件描述符设置…

好玩的调度技术-生成式三维技术

好玩的调度技术-生成式三维技术 文章目录 好玩的调度技术-生成式三维技术前言一、效果图&#xff1f;二、技术实现系列文章链接其他文章新篇章 前言 目前休息了&#xff0c;预计休息半年&#xff0c;这半年里只会零星更新一些好玩的技术&#xff0c;感觉好玩系列都快成系列文章…

详解如何使用VSCode搭建TypeScript环境(适合小白)

搭建Javascript环境 因为TypeScript不能直接在浏览器上运行。它需要编译器来编译并生成JavaScript文件。所以需要首先安装好javascript环境&#xff0c;可以参考文章&#xff1a; 详解如何使用VS code搭建JavaScript环境&#xff08;适合小白&#xff09;_vscode配置javascri…

LeetCode Hot100 437.路径总和III

题目&#xff1a; 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从…

不可错过的设计工具!7款亲测好用的网页设计工具推荐!

网页设计并不容易&#xff0c;易于使用的网页设计工具更难找到。随着网络的快速发展&#xff0c;网站迅速崛起&#xff0c;网页设计也很流行。本文收集了 7 种良心和易于使用的网页设计工具&#xff0c;每一种近年来都受到网页设计师的广泛欢迎&#xff0c;以确保实用和易于使用…

前端技术探秘-Nodejs的CommonJS规范实现原理 | 京东物流技术团队

了解Node.js Node.js是一个基于ChromeV8引擎的JavaScript运行环境&#xff0c;使用了一个事件驱动、非阻塞式I/O模型&#xff0c;让JavaScript 运行在服务端的开发平台&#xff0c;它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。Node中增添了很…

免费商用字体,进来领取!!!

如果你不知道去哪里找免费可商用字体&#xff0c;那一定要收藏好这几个网站&#xff0c;全部都是免费无版权字体&#xff0c;以后再也不用担心侵权问题了。 1、免费字体网 https://font.sucai999.com/ 一个免费可商用字体搬运工&#xff0c;实时跟新市面上免费商用的字体。网站…

国家万亿资金助力城市生命线城市内涝积水监测系统

自2023年年初以来&#xff0c;我国多个地区遭遇了洪涝、干旱、台风、风雹等灾害的侵袭&#xff0c;部分地区灾情严重&#xff0c;经济损失较大。为应对灾后恢复重建工作的艰巨任务&#xff0c;本次国债将主要投向灾后恢复重建以及提升防灾减灾救灾能力。其中&#xff0c;将全面…

12V 全桥驱动芯片GC9008,0.1A 持续驱动输出电流,可替代MX6208

GC9008 是一款 12V 全桥驱动芯片&#xff0c;为 摄像机、消费类产品提供高性价比的方案。能提供 0.1A 的持续输出电流。 可以工作在 4.5~15V 的电源电压上。 GC9008 具有 PW &#xff08; IN1/IN2 &#xff09;输入接口 , 与行业标准器件兼容. GC9008S 是 SOP8 封装&a…

【JavaEE初阶】 博客系统项目--前端页面设计实现

文章目录 &#x1f332;主要内容&#x1f38d;预期效果&#x1f6a9;博客列表页效果&#x1f6a9;博客详情页&#x1f6a9;博客登录页&#x1f6a9;博客编辑页 &#x1f340;实现博客列表页&#x1f6a9;实现导航栏&#x1f388;页面主体部分 &#x1f384;实现博客详情页&…

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

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

文件元数据批量修改:mp3音频和mp4视频的元数据如何批量修改

在数字媒体处理和管理的日常工作中&#xff0c;文件元数据的批量修改是一个常见的需求。元数据&#xff0c;或者称为文件信息&#xff0c;可以包括文件的创建日期、修改日期、文件名、文件大小、标签等。在音乐和视频处理领域&#xff0c;例如对mp3音频和mp4视频文件&#xff0…

linux下的工具---gdb

一、gdb简介 GDB,是The GNU Project Debugger 的缩写&#xff0c;是 Linux 下功能全面的调试工具。 GDB支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&am…

自驾游汽车托运是交智商税吗?

自驾游汽车托运是交智商税吗? 亲爱的小伙伴们 你们有没有遇到过这样的困扰&#xff1a; 自驾游时&#xff0c;车辆的运输问题让你头疼不已? 是选择自己驾驶还是托运呢? 今天&#xff0c;我就来给大家种草一下汽车托运的好处&#xff0c; 让你的自驾游之旅更加轻松愉快! 1️.…

安防视频监控/磁盘阵列/集中云存储平台EasyCVR设备录像保活不生效原因是什么?该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

【Linux】安卓端JuiceSSH结合内网穿透实现远程连接服务器

目录 前言1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 前言 处于内网的虚拟机如何被外网访问呢&#xff1f;如何手机就能访问虚拟机呢&#xff1f; 本文介绍 cpolarJuiceSSH 实现手机端远程连接Linux虚拟…

elk日志分析系统:

elk日志分析系统: elk是一套完整的日志集中处理方案&#xff0c;由三个开源的软件简称组成&#xff1b; E:Easticsearch 简称ES是一个开源的&#xff0c;分布式的存储检索引擎&#xff0c;&#xff08;索引型的非关系数据库&#xff09;存储日志 由java代码开发的&#xff0…

CSC公派博士后|管理学老师赴韩国首尔大学达成目标

J老师自身背景正好卡在CSC公派博士后申报条件的边缘&#xff0c;为增大通过概率&#xff0c;其提出优选亚洲范围内的世界知名高校、专业相符、2年博士后职位的要求。最终我们用韩国首尔大学的邀请函助其顺利获批CSC&#xff0c;实现了所有既定目标。 J老师背景&#xff1a; 申…

【Tiny_CD】Tiny_CD变化检测网络详解(含python代码)

题目:TinyCD: A (Not So) Deep Learning Model For Change Detection 论文:paper 代码:code 目录 🍟 🍟1.摘要 🍗🍗 2.贡献 🍖🍖 3.网络结构