string类小贴士:让你的C++字符串处理更高效


目录

​编辑

一、为什么要学习string类

1.1 C语言中的字符串

1.2 面试题

🌳字符串相加https://leetcode.cn/problems/add-strings/description/

二、标准库中的string类

2.1 string类

2.2 string类的常用接口说明

1. string类对象的常见构造

2. string类对象的容量操作

3. string类对象的访问及遍历操作

4. string类对象的修改操作

5. string类非成员函数

6. vs和g++下string结构的说明

🌵vs下string的结构:

🌵g++下string的结构:

三、OJ习题

1. 仅仅反转字母

2. 找字符串中第一个只出现一次的字符

3. 字符串里面最后一个单词的长度

4. 验证一个字符串是否是回文串

5. 字符串相加

四、扩展阅读

🥤:面试中string的一种正确写法

🍺:STL中的string类怎么了


一、为什么要学习string类

1.1 C语言中的字符串

        C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

1.2 面试题

  • 🌳字符串相加icon-default.png?t=N7T8https://leetcode.cn/problems/add-strings/description/

        在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。

二、标准库中的string类

        学习C++中的string类非常重要,但是它的接口又非常的多,我们不可能将它们全部记住,并且也没这个必要,我们只需要熟练掌握平常工作中需要经常用到的一些接口就行了,剩下的可以通过查阅相关文档来了解string类的成员函数、用法和示例。

这里介绍两个网站,以供参考:

  • C++官方网站(cppreference):
  1. 网址:https://en.cppreference.com/w/
  2. 优点:作为一个wiki风格的网站,提供了非常详尽和全面的C++语言参考资料。覆盖了C++标准库、语言特性、语法规则等方方面面。
  3. 缺点:有些页面可能含有过多详细信息,对初学者难以理解。

  • cplusplus网站(推荐):
  1. 网址:http://www.cplusplus.com/
  2. 优点:提供了C++语言的完整参考资料、教程和示例代码。有专门的页面介绍标准库函数、关键字和语法规则。
  3. 缺点:部分资料可能有限,对一些高级语言特性和最新标准可能覆盖不够全面。

2.1 string类

string类的文档介绍icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/string/string/?kw=string

  1. 字符串是表示字符序列的类。

  2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
  3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。
  4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(更多的模板信息请参考basic_string)。
  5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

总结: 

  • string是表示字符串的字符串类 。
  • 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  • string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits,allocator>string;

  • 不能操作多字节或者变长字符的序列。

在使用string类时,必须包含#include头文件以及using namespace std;

2.2 string类的常用接口说明

1. string类对象的常见构造

  • 🌵函数名称:constructoricon-default.png?t=N7T8https://legacy.cplusplus.com/reference/string/string/string/

#include <iostream>
using namespace std;

#include <string>

void test_string1()
{
	string s0; // 默认构造,构造空的string类对象
	string s1("hello world"); // 字符串构造
	string s2(s1); // 拷贝构造

	string s3(s1, 5, 3); // 将s1从第5个位置开始取3个字符
	string s4(s1, 5, 10); // 将s1从第5个位置开始取10个字符
	string s5(s1, 5); // 不给第三个参数,就默认是缺省值npos(npos是string里面的一个静态成员变量  static const size_t npos = -1),后边有多少取多少
	string s6(10, '*');

	cout << s0 << endl;
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
	cout << s5 << endl;
	cout << s6 << endl;
}

int main()
{
	test_string1();

	return 0;
}

2. string类对象的容量操作

🌳函数名称链接: (size + length + capacity + empty + clear + reserve + resize)


#include <iostream>
using namespace std;

#include <string>

void test_string()
{
	string s1("hello world hello world hello world");
	cout << s1.size() << endl;
	cout << s1.length() << endl;
	cout << s1.max_size() << endl;
	cout << s1.capacity() << endl << endl;; // 不包含\0占用的空间


	// 查看扩容机制
	string s;
	size_t sz = s.capacity();
	cout << "making s grow:\n";
	for (int i = 0; i < 100; ++i)
	{
		s.push_back('c'); // 自动扩容
		if (sz != s.capacity())
		{
			sz = s.capacity();
			cout << "capacity changed: " << sz << '\n';
		}
	}
	cout << endl;

	// clear只是清数据,不会清空间
	cout << s1 << endl;
	cout << s1.capacity() << endl;
	cout << s1.size() << endl;

	s1.clear();
	cout << s1 << endl;
	cout << s1.capacity() << endl;
	cout << s1.size() << endl << endl;

	// 缩容
	// 但不会将string对象的容量缩减到0,因为它会
	// 保留一定的冗余空间以提高字符串的操作效率
	s1.shrink_to_fit();
	cout << s1.capacity() << endl;
	cout << s1.size() << endl << endl;
}

int main()
{
	test_string();

	return 0;
}


#include <iostream>
using namespace std;

#include <string>
 
void test_string()
{
	// reserve是手动扩容,比capacity大才会扩容
	// reserve用的比较多,因为如果我们知道要插入多少数据
	// 就会提前开好空间,这样就避免了扩容,提高了效率
	string s2("hello hello hello hello");
	cout << s2.size() << endl;
	cout << s2.capacity() << endl;

	s2.reserve(200);
	cout << s2.size() << endl;
	cout << s2.capacity() << endl << endl;

	// resize
	// 如果 n < size 删除
	// 如果 size < n < capacity 插入空字符
	// 如果 capacity < n 扩容 + 插入
	string s3("hello world");
	cout << s3.size() << endl;
	cout << s3.capacity() << endl << endl;

	s3.resize(10);
	cout << s3.size() << endl;
	cout << s3.capacity() << endl << endl;

	s3.resize(20);
	cout << s3.size() << endl;
	cout << s3.capacity() << endl << endl;

	s3.resize(30, '*');
	cout << s3.size() << endl;
	cout << s3.capacity() << endl << endl;
}

int main()
{
	test_string();

	return 0;
}

 


注意:

  1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
  2. clear()只是将string中有效字符清空,不改变底层空间大小。

  3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。

  4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。

3. string类对象的访问及遍历操作


  • 🌲函数名称:operatoricon-default.png?t=N7T8https://legacy.cplusplus.com/reference/string/string/operator%5B%5D/
  • 🌲函数名称:beginicon-default.png?t=N7T8https://legacy.cplusplus.com/reference/string/string/begin/ + endicon-default.png?t=N7T8https://legacy.cplusplus.com/reference/string/string/end/
#include <iostream>
using namespace std;

#include <string>

// string的三种遍历方式
void test_string()
{
	string s1("hello world");

	// 需要注意的以下三种方式除了遍历string对象,还可以修改string中的字符,
	// 另外以下三种方式对于string而言,第一种使用最多
	// 1. for+operator[]、下标 + []
	for (size_t i = 0; i < s1.size(); i++)
	{
		cout << s1[i] << " ";
		//cout << s1.operator[](i) << " ";
	}
	cout << endl;

	// 修改
	for (size_t i = 0; i < s1.size(); i++)
	{
		s1[i]++;
	}

	for (size_t i = 0; i < s1.size(); i++)
	{
		cout << s1[i] << " ";
	}
	cout << endl;

	// 2.迭代器(区间是左闭右开)
	// begin是第一个有效数据的迭代器
	// end是最后一个位置的下一个位置(就是\0,因为\0不是有效字符)
	string::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	// 3.范围for
	// 底层就是迭代器
	for (auto e : s1)
	{
		cout << e << " ";
	}
	cout << endl;
}

int main()
{
	test_string();

	return 0;
}


  • 🌲函数名称:rbeginicon-default.png?t=N7T8https://legacy.cplusplus.com/reference/string/string/rbegin/ + rendicon-default.png?t=N7T8https://legacy.cplusplus.com/reference/string/string/rend/
#include <iostream>
using namespace std;

#include <string>

// 反向迭代器
void test_string()
{
	string s("hello world");

	// 可读可写
	string::reverse_iterator rit = s.rbegin();
	while (rit != s.rend())
	{
		cout << *rit << " ";
		++rit;// 注意这儿是++
	}
	cout << endl;

	// 只读
	const string s1("hello world");
	string::const_reverse_iterator rit1 = s1.rbegin();
	while (rit1 != s1.rend())
	{
		cout << *rit1 << " ";
		++rit1;
	}
	cout << endl;
}

int main()
{
	test_string();

	return 0;
}


🌳函数名称:operator[]icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/string/string/operator%5B%5D/ + aticon-default.png?t=N7T8https://legacy.cplusplus.com/reference/string/string/at/

#include <iostream>
using namespace std;

#include <string>
 
void test_string()
{
	string s("hello world");
	cout << s[1] << endl;
	cout << s.at(1) << endl;

	// []和at的不同在于对数组越界访问的报错不一样
	/*s[15];
	s.at(15);*/
}

int main()
{
	test_string();

	return 0;
}

4. string类对象的修改操作

 🌳函数名称链接:push_back + append + operator+= + c_str + find + npos + rfind + substr


#include <iostream>
using namespace std;

#include <string>
 
void test_string()
{
	string s("hello world");

	// push_back:在尾部插入一个字符
	s.push_back('!');
	cout << s << endl;

	// append:在尾部追加一个字符串
	s.append("apple");
	cout << s << endl;
	// 在尾部插入n个字符
	s.append(10, '$');
	cout << s << endl;

	string s1("  friend ");
	/*s.append(s1);
	cout << s << endl;*/
	// 追加时头部只留一个空格,尾部不要空格
	s.append(++s1.begin(), --s1.end());
	cout << s << endl;

	// operator+=:在字符串后边追加字符串
	string s3("hello");
	s3 += " ";
	s3 += "world!";
	cout << s3 << endl;
}

int main()
{
	test_string();

	return 0;
}


#include <iostream>
using namespace std;

#include <string>
 
void test_string()
{
	string s("hello");
	cout << s << endl;

	// assign:赋值(用一个值覆盖掉字符串)
	s.assign("xxxxxx");
	cout << s << endl;

	// insert:在某个位置进行插入
	s.insert(0, "@@@");// 在第0个位置插入@@@
	cout << s << endl;

	// erase :删除字符串中的字符
	s.erase(1, 2);// 从第一个位置开始删除两个字符
	cout << s << endl;
	s.erase();// 全部删除(erase支持全缺省)
	cout << s << endl;

	// replace:替换字符串的一部分
	string s1("hello world hi hai");
	s1.replace(5, 1, "&");
	cout << s1 << endl;

	// 替换字符串中的空格
	size_t pos = s1.find(' ');
	while (pos != s1.npos)
	{
		s1.replace(pos, 1, "$");
		pos = s1.find(' ');
	}
	cout << s1 << endl;
	// 第二种方法
	string s2;
	for (auto ch : s1)
	{
		if (ch != ' ')
		{
			s2 += ch;
		}
		else
		{
			s2 += '$';
		}
	}
	cout << s2 << endl;
}

int main()
{
	test_string();

	return 0;
}


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

void test_string()
{
	// c_str 返回c格式字符串
	string s("hello world");
	string filename("test.cpp");
	FILE* fout = fopen(filename.c_str(), "r");

	// find 从字符串pos位置从前往后找字符c,返回该字符在字符串中的位置
	// substr 在str中从pos位置开始,截取n个字符,然后将其返回
	// 拿到文件的后缀
	string s1("test.txt");
	size_t pos1 = s1.find('.');
	if (pos1 != string::npos)
	{
		string suffix = s1.substr(pos1);
		//string suffix = s1.substr(pos1, s1.size() - pos1);

		cout << suffix << endl;
	}
	else
	{
		cout << "没有后缀" << endl;
	}

	// rfind 从字符串pos位置从后往前找字符c,返回该字符在字符串中的位置
	// 获取文件后缀
	string s2("file.c.tar.zip");
	size_t pos2 = s2.rfind('.');
	if (pos2 != string::npos)
	{
		string suffix = s2.substr(pos2);
		cout << suffix << endl;
	}
	else
	{
		cout << "没有后缀" << endl;
	}

	string url1("https://legacy.cplusplus.com/reference/string/string/");
	string url2("https://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&dyTabStr=MCwxLDIsMyw3LDYsNCw1LDgsOQ%3D%3D&word=%E4%B9%A0%E8%BF%91%E5%B9%B3%E5%BC%BA%E8%B0%83%E4%B8%8D%E8%83%BD%E8%AE%A9%E4%BB%96%E4%BB%AC%E5%90%83%E4%BA%8F");
	string protocal, domain, uri;
	size_t i1 = url1.find(':');
	if (i1 != string::npos)
	{
		string protocal = url1.substr(0, i1 - 0);
		cout << protocal << endl;
	}
	size_t i2 = url1.find('/', i1 + 3);
	if (i2 != string::npos)
	{
		string domain = url1.substr(i1 + 3, i2 - (i1 + 3));
		cout << domain << endl;

		string uri = url1.substr(i2 + 1);
		cout << uri << endl;
	}
}

int main()
{
	test_string();

	return 0;
}

注意:

  1. 在string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
  2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。

5. string类非成员函数

  🌳函数名称链接:operator+ + relational operators + swap + operator>> + operator<< + getline


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

void test_string()
{
	// operator+
	string s1 = "hello";
	string s2 = " world";
	string ret = s1 + s2;
	cout << ret << endl;
	// 支持string + 字符串, 也支持字符串 + string
	string ret1 = s1 + "world";
	string ret2 = "hello" + s2;
}

int main()
{
	test_string();

	return 0;
}

6. vs和g++下string结构的说明

注意:下述结构是在32位平台下进行验证,32位平台下指针占4个字节。

🌵vs下string的结构:

string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义string中字符串的存储空间:

  • 当字符串长度小于16时,使用内部固定的字符数组来存放。
  • 当字符串长度大于等于16时,从堆上开辟空间。
union _Bxty
{ // storage for small buffer or pointer to larger one
	value_type _Buf[_BUF_SIZE];
	pointer _Ptr;
	char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;

这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。

其次:还有一个size_t字段保存字符串长度一个size_t字段保存从堆上开辟空间总的容量。

最后:还有一个指针做一些其他事情。

故总共占16+4+4+4=28个字节。

🌵g++下string的结构

G++下,string是通过写时拷贝实现的,string对象总共占4个字节,内部只包含了一个指针,该指针将来指向一块堆空间,内部包含了如下字段:

  • 空间总大小
  • 字符串有效长度
  • 引用计数
struct _Rep_base
{
	size_type _M_length;
	size_type _M_capacity;
	_Atomic_word _M_refcount;
}
  • 指向堆空间的指针,用来存储字符串。

三、OJ习题

1. 仅仅反转字母icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-only-letters/description/

class Solution
{
public:
	bool isLetter(char ch)
	{
		if (ch >= 'a' && ch <= 'z')
			return true;
		if (ch >= 'A' && ch <= 'Z')
			return true;
		return false;
	}
	string reverseOnlyLetters(string S)
	{
		if (S.empty())
			return S;
		size_t begin = 0, end = S.size() - 1;
		while (begin < end)
		{
			while (begin < end && !isLetter(S[begin]))
				++begin;
			while (begin < end && !isLetter(S[end]))
				--end;
			swap(S[begin], S[end]);
			++begin;
			--end;
		}
		return S;
	}
};

2. 找字符串中第一个只出现一次的字符icon-default.png?t=N7T8https://leetcode.cn/problems/first-unique-character-in-a-string/description/

class Solution
{
public:
    int firstUniqChar(string s)
    {
        int count[26] = { 0 };
        // 统计每个字符出现的次数
        for (auto ch : s)
        {
            count[ch - 'a']++;
        }
        // 按照字符次序从前往后找只出现一次的字符
        for (int i = 0; i < s.size(); ++i)
        {
            if (1 == count[s[i] - 'a'])
                return i;
        }
        return -1;
    }
};

3. 字符串里面最后一个单词的长度icon-default.png?t=N7T8https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da?tpId=37&&tqId=21224&rp=5&ru=/activity/oj&qru=/ta/huawei/question-ranking

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

int main() 
{
    string str;

    // 不要使用cin>>line,因为会它遇到空格就结束了
    // while(cin>>line)
    while (getline(cin, str))
    {
        // 从后往前找第一个空格的位置
        size_t pos = str.rfind(' ');
        // 左开右闭,size是最后一个字符的下一个位置
        // pos是空格的位置,+1刚好是最后一个单词的起始位置
        cout << str.size() - (pos + 1) << endl;
    }

    //char ch = getchar();
    //while (ch != '\n') 
    //{
    //    str += ch;
    //    ch = getchar();
    //}

    return 0;
}

4. 验证一个字符串是否是回文串icon-default.png?t=N7T8https://leetcode.cn/problems/valid-palindrome/description/

class Solution {
public:
	bool isLetterOrNumber(char ch)
	{
		return (ch >= '0' && ch <= '9')
			|| (ch >= 'a' && ch <= 'z')
			|| (ch >= 'A' && ch <= 'Z');
	}
	bool isPalindrome(string s) {
		// 先小写字母转换成大写,再进行判断
		for (auto& ch : s)
		{
			if (ch >= 'a' && ch <= 'z')
				ch -= 32;
		}
		int begin = 0, end = s.size() - 1;
		while (begin < end)
		{
			while (begin < end && !isLetterOrNumber(s[begin]))
				++begin;
			while (begin < end && !isLetterOrNumber(s[end]))
				--end;
			if (s[begin] != s[end])
			{
				return false;
			}
			else
			{
				++begin;
				--end;
			}
		}
		return true;
	}
};

5. 字符串相加icon-default.png?t=N7T8https://leetcode.cn/problems/add-strings/description/

class Solution 
{
public:
    string addStrings(string num1, string num2) 
    {
        // 最后一个字符的位置
        int end1 = num1.size() - 1, end2 = num2.size() - 1;
        string retstr;

        // 提前开好空间
        retstr.reserve(num1.size() > num2.size() ? num1.size() + 1 : num2.size() + 1);
        // 表示进位
        int next = 0;
        // 注意:长字符串应该最后才结束相加
        while (end1 >= 0 || end2 >= 0)
        {
            int val1 = end1 >= 0 ? num1[end1--] - '0' : 0;
            int val2 = end2 >= 0 ? num2[end2--] - '0' : 0;

            int ret = val1 + val2 + next;
            next = ret / 10; // 取进位
            ret = ret % 10; // 取个位数

            //头插,时间复杂度为n^2
            //retstr.insert(0, 1, ret + '0');

            //尾插
            retstr += '0' + ret;
        }

        if (next == 1)
        {
            //retstr.insert(0, 1, '1');

            retstr += '1';
        }

        //将字符串反转,时间复杂度提升到O(n)
        reverse(retstr.begin(), retstr.end());

        return retstr;
    }
};

四、扩展阅读

🥤:面试中string的一种正确写法icon-default.png?t=N7T8https://coolshell.cn/articles/10478.html

🍺:STL中的string类怎么了icon-default.png?t=N7T8https://blog.csdn.net/haoel/article/details/1491219

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

精准定位,智慧提纯:高级数据提取策略

在数据驱动的时代&#xff0c;高级数据提取策略成为企业决策、科学研究以及各类项目成功的关键。数据提取&#xff0c;不仅仅是简单地收集信息&#xff0c;而是需要精准定位目标数据&#xff0c;并通过智慧提纯方法&#xff0c;从海量数据中提取出有价值、有深度的信息。本文将…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第40课-实时订阅后端数据

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第40课-实时订阅后端数据 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引…

程序员要学会偷懒--excel转建表语句

如下需求&#xff1a;一个复杂的统战系统&#xff0c;用户信息字段总共有26个sheet&#xff0c;54张小表&#xff0c;没有什么复杂的业务逻辑&#xff0c;纯增删改查。字段目测在1000个以上。建表54张。领导交待了一句这周末完成&#xff0c;我&#xff1f;&#xff1f;&#x…

【数组】【快慢双指针】删除有序数组中的重复项+移除元素+删除有序数组中的重复项II

今天趁热打铁&#xff0c;接着刷了几道标签是【数组】的题&#xff0c;基本都是双指针就能解决。 1、删除有序数组中的重复项 该题对应力扣网址 class Solution { public:int removeDuplicates(vector<int>& nums) {int i,j;int count 0;int n nums.size();nums.…

vue3+ Element-Plus 点击勾选框往input中动态添加多个tag

实现效果&#xff1a; template&#xff1a; <!--产品白名单--><div class"con-item" v-if"current 0"><el-form-item label"平台名称"><div class"contaion" click"onclick"><!-- 生成的标签 …

下载NVIDIA官网的培训视频,生成中文字幕和PPT

下载NVIDIA官网的培训视频,生成中文字幕和PPT 一.[视频网站](https://www.nvidia.cn/on-demand/session/gtc24-s62129/)二.如何获取视频的原始链接三.下载视频的脚本【生成output.mp4】四.安装whisper环境【语音识别生成英文字幕】五.下载whisper模型六.生成英文字幕【输出merg…

解决微调后的模型导入ollama后出现”胡言乱语“情况

解决微调后的模型导入ollama后出现”胡言乱语“情况 先说结论&#xff0c;出现该问题的原因主要是因为Modelfile文件没有配置好。 这个是ModelFile文件的配置&#xff0c;第一行的from为要用的模型地址。 # sets the temperature to 1 [higher is more creative, lower is mo…

陪诊小程序开发,陪诊师在线接单

近几年&#xff0c;陪诊师成为了一个新兴行业&#xff0c;在科技时代中&#xff0c;陪诊小程序作为互联网下的产物&#xff0c;为陪诊市场带来了更多的便利。 当下生活压力大&#xff0c;老龄化逐渐严重&#xff0c;年轻人很难做到陪同家属看病。此外&#xff0c;就诊中出现了…

Vue3项目中Pinia使用详解

开篇 本文的目的是创建一个使用typescript的vue3项目&#xff0c;并使用pinia来管理状态。 详细步骤 创建项目 创建vue3项目&#xff0c;并使用vite作为打包工具 npm create vitelatest vue3_pinia // 选择vue,随后选择typesript进入项目&#xff0c;并按照依赖包 cd vue3_…

植物大战僵尸(杂交版)最新版V2.1来袭!

【新手指导】最新版v2.1来袭 1.闪退怎么办&#xff1f; 答:窗口模式可以解决大部分问题。输入法转换成英文也可以。最后一种办法管理员运行&#xff0c;再后台可运行&#xff0c;即便不是窗口也不会闪退&#xff0c;亲测有效 2.哪里下载&#xff1f; 答&#xff1a;夸克网盘htt…

OrangePi AIpro测评:性能、应用与开发者体验解析

一、OrangePi AIpro介绍 OrangePi AIpro(8T)采用昇腾AI技术路线&#xff0c;具体为4核64位处理器AI处理器&#xff0c;集成图形处理器&#xff0c;支持8TOPS AI算力&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接32GB/64GB/128GB/256GB eMMC模块&#xff0c;支持双4K高…

学习ZYNQ——使用IP核

文章目录 [TOC](文章目录) 前言一、新建Vivado工程二、使用IP核1.加载IP2.查看IP核3.应用IP核 三、添加源文件1.led.v2.约束文件pin_led.xdc 四、综合、运行程序 前言 加载前面使用HLS生成的IP核&#xff0c;实现LED灯的闪烁&#xff0c;熟悉整套流程的步骤&#xff1a; 前一篇…

关于对pagination.js源代码进行修改且引入项目使用

实现效果 使用定时器对组件进行每秒请求&#xff0c;每过固定时间之后&#xff0c;进行下一页项目请求&#xff0c;进行到最后一页请求的时候返回第一页。 首先引入js插件 <script src"./js/pagination.js" type"text/javascript"></script>…

NAND flash测试-雷龙发展

文章目录 一、简介 二、速度测试 最近比较忙&#xff0c;也一直没空发什么文章&#xff0c;这算是新年第一篇吧&#xff0c;正好最近收到了一个雷龙的flash芯片&#xff0c;先拿来玩一下吧。 有兴趣的小伙伴可以去雷龙官网找小姐姐领取一个免费试用。 一、简介 大概样子就是上面…

大模型企业落地:汽车行业知识大模型应用

前言 在当今这个信息爆炸的时代&#xff0c;知识管理成为了企业提升核心竞争力的关键。特别是在汽车行业这样一个技术密集、信息量庞大的领域&#xff0c;如何高效管理和利用知识资源&#xff0c;成为了每个企业必须面对的挑战。 汽车行业的知识管理痛点 汽车行业作为现代工…

RCD负载箱:电力系统的安全保障

在电力系统中&#xff0c;负载箱是一种重要的设备&#xff0c;它的主要功能是模拟实际的电力负载&#xff0c;以便对电力系统进行各种性能测试和分析。RCD负载箱一种特殊类型的负载箱&#xff0c;它具有剩余电流保护功能&#xff0c;可以有效地防止电气火灾和电击事故的发生&am…

基于Spring Boot的智能分析平台

项目介绍&#xff1a; 智能分析平台实现了用户导入需要分析的原始数据集后&#xff0c;利用AI自动生成可视化图表和分析结论&#xff0c;改善了传统BI系统需要用户具备相关数据分析技能的问题。该项目使用到的技术是SSMSpring Boot、redis、rabbitMq、mysql等。在项目中&#…

工业 UI 风格,展现独特魅力

工业 UI 风格&#xff0c;展现独特魅力

Facebook:数字时代的文化交流平台

在当今信息爆炸的数字时代&#xff0c;Facebook已经成为了一个不可或缺的社交媒体平台&#xff0c;不仅在个人生活中起到了联系社交的作用&#xff0c;更在全球范围内促进了文化交流和理解。本文将深入探讨Facebook作为文化交流平台的重要性&#xff0c;并分析其在数字时代如何…