快速上手STL中string类的使用

news2024/11/7 7:19:14

目录

一、构造函数

二、容量操作

三、元素访问

 四、字符串修改

1.+=操作符重载

2.追加函数append

3.尾插

4.尾删

5.重新赋值

6.插入

7.删除

8.查找

9.交换两个字符串

五、字符串的其他操作

1.获取C风格的字符串

2.复制字符串中的指定内容

3.提取子串

4.+操作符重载

5.获取一行


一、构造函数

1、构造空的字符串(默认构造)

  • 函数原型:string();

2、拷贝构造

  • 函数原型:string (const string& str);

3、用指定字符串的部分构造

  • 函数原型:string (const string& str, size_t pos, size_t len = npos);

4、用C风格的字符串构造

  • 函数原型:string (const char* s);

5、用C风格的字符串的前n个构造

  • 函数原型:string (const char* s, size_t n);

6、用n个相同的字符构造

  • 函数原型:string (size_t n, char c);

使用示例:

#include <iostream>
#include <string>

void test_construct()
{
	// 构造空串
	std::string s1 = std::string();
	// 用C风格的字符串构造
	std::string s2("hello string");
	// 用C风格的字符串的前n个构造
	std::string s3("hello string", 5);
	// 用n个相同的字符构造
	std::string s4(5, 'h');
	// 拷贝构造
	std::string s5(s2);
	// 用指定字符串的部分构造
	std::string s6(s2, 6, 6);

	std::cout << "s1: " << s1 << std::endl;
	std::cout << "s2: " << s2 << std::endl;
	std::cout << "s3: " << s3 << std::endl;
	std::cout << "s4: " << s4 << std::endl;
	std::cout << "s5: " << s5 << std::endl;
	std::cout << "s6: " << s6 << std::endl;
}

int main()
{
	test_construct();

	return 0;
}

运行结果:
s1:
s2: hello string
s3: hello
s4: hhhhh
s5: hello string
s6: string

二、容量操作

1、获取字符串有效字符的个数

  • 函数原型:size_t size() const;  size_t length() const; 这两个接口的功能是相同的,这是历史发展的原因导致的。

2、 获取字符串的容量

  • 函数原型:size_t capacity() const;

3、清空字符串

  • 函数原型:void clear();

4、判断字符串是否为空

  • 函数原型:bool empty() const;

使用示例:

void test_capacity_operation()
{
	std::string str("hello string");

	// 获取字符串有效字符的个数:size_t size() const; size_t length() const;
	size_t size = str.size();
	size_t len = str.length();

	std::cout << "size: " << size << std::endl;
	std::cout << "len: " << len << std::endl;

	// 获取字符串的容量:size_t capacity() const;
	size_t capacity = str.capacity();
	std::cout << "capacity: " << str.capacity() << std::endl;

	// 清空字符串:void clear();
	str.clear();
	std::cout << "清空字符串之后" << std::endl;
	std::cout << "size: " << str.size() << std::endl;
	std::cout << "capacity: " << str.capacity() << std::endl;

	// 判断字符串是否为空:bool empty() const;
	if (!str.empty())
	{
		std::cout << "字符串不为空" << std::endl;
	}
	else
	{
		std::cout << "字符串为空" << std::endl;
	}
}

int main()
{
	test_capacity_operation();

	return 0;
}

运行结果:
size: 12
len: 12
capacity: 15
清空字符串之后
size: 0
capacity: 15
字符串为空

5、改变容量

  • 函数原型:void reserve (size_t n = 0);

使用示例:

// 改变容量
void test_reserve()
{
	std::string str("hello string");

	std::cout << "size: " << str.size() << std::endl;
	std::cout << "capacity: " << str.capacity() << std::endl << std::endl;

	str.reserve(100);
	std::cout << "after str.reserve(100);" << std::endl;
	std::cout << "size: " << str.size() << std::endl;
	std::cout << "capacity: " << str.capacity() << std::endl << std::endl;


	str.reserve(20);
	std::cout << "after str.reserve(20);" << std::endl;
	std::cout << "size: " << str.size() << std::endl;
	std::cout << "capacity: " << str.capacity() << std::endl;
}

int main()
{
	test_reserve();

	return 0;
}

运行结果:
size: 12
capacity: 15

after str.reserve(100);
size: 12
capacity: 111

after str.reserve(20);
size: 12
capacity: 111
  • 该结果为VS2019运行结果,可以看到,VS2019的结果是不缩容。具体缩不缩容还得看具体的编译器。
  • reserve只影响容量,不影响有效字符的个数。

6、改变有效字符的大小

  • 函数原型:
  • void resize (size_t n);
  • void resize (size_t n, char c);

使用示例:

void test_resize()
{
	// 测试void resize (size_t n);
	std::string str("hello string");

	std::cout << "str: " << str << std::endl;
	std::cout << "size: " << str.size() << std::endl;
	std::cout << "capacity: " << str.capacity() << std::endl << std::endl;
	
	str.resize(5);
	std::cout << "after resize(5) " << std::endl;
	std::cout << "str: " << str << std::endl;
	std::cout << "size: " << str.size() << std::endl;
	std::cout << "capacity: " << str.capacity() << std::endl << std::endl;

	str.resize(20);
	std::cout << "after resize(20) " << std::endl;
	std::cout << "str: " << str << std::endl;
	std::cout << "size: " << str.size() << std::endl;
	std::cout << "capacity: " << str.capacity() << std::endl << std::endl;

	// 测试void resize (size_t n, char c);
	// 重新为str赋值
	str = "hello string";

	std::cout << "str: " << str << std::endl;
	std::cout << "size: " << str.size() << std::endl;
	std::cout << "capacity: " << str.capacity() << std::endl << std::endl;

	str.resize(5,'X');
	std::cout << "after resize(5,'X') " << std::endl;
	std::cout << "str: " << str << std::endl;
	std::cout << "size: " << str.size() << std::endl;
	std::cout << "capacity: " << str.capacity() << std::endl << std::endl;

	str.resize(20,'Y');
	std::cout << "after resize(20,'Y') " << std::endl;
	std::cout << "str: " << str << std::endl;
	std::cout << "size: " << str.size() << std::endl;
	std::cout << "capacity: " << str.capacity() << std::endl << std::endl;
}

int main()
{
	test_resize();

	return 0;
}

运行结果:
str: hello string
size: 12
capacity: 15

after resize(5)
str: hello
size: 5
capacity: 15

after resize(20)
str: hello
size: 20
capacity: 31

str: hello string
size: 12
capacity: 31

after resize(5,'X')
str: hello
size: 5
capacity: 31

after resize(20,'Y')
str: helloYYYYYYYYYYYYYYY
size: 20
capacity: 31
  • resize既改变容量,又改变有效字符的个数。
  • 当n大于当前字符串的长度时,会用指定的字符填充剩余的有效字符的空间,如果没有指定字符,则默认使用 '\0'填充

三、元素访问

1、通过重载的operator[]访问元素

  • 函数原型:
  • char& operator[] (size_t pos);
  • const char& operator[] (size_t pos) const;

该函数重载了两个版本,一个适用于普通对象,一个适用于const对象。

普通对象调用非const版本,返回非const修饰对象的引用,可读可写。

const对象调用const版本,返回const修饰对象的引用,只可以读。

后面所有的重载const和非const版本的函数都是这个原因。

2、通过at()函数访问

  • 函数原型:
  • char& at (size_t pos);
  • const char& at (size_t pos) const;

3、通过迭代器访问

  • std::string::iterator 是定义在string类里面的类型,是STL提供的一种统一的访问容器的方式。
  • 用起来像指针

4、通过范围for访问

使用示例:

void test_element_access()
{
	std::string str("hello string");

	//1、通过重载的operator[]访问元素
	for (int i = 0; i < str.size(); ++i)
	{
		std::cout << str[i];
	}
	std::cout << std::endl;

	//2、通过at()函数访问
	for (int i = 0; i < str.size(); ++i)
	{
		std::cout << str.at(i);
	}
	std::cout << std::endl;

	//3、通过迭代器访问
	std::string::iterator begin_it = str.begin();
	std::string::iterator end_it = str.end();
	while (begin_it != end_it)
	{
		std::cout << *begin_it;
		begin_it++;
	}
	std::cout << std::endl;

	//4、通过范围for访问
	for (auto e : str)
	{
		std::cout << e;
	}
	std::cout << std::endl;
}

int main()
{
	test_element_access();

	return 0;
}

运行结果:
hello string
hello string
hello string
hello string

 四、字符串修改

1.+=操作符重载

函数原型:

  • += 一个字符串:string& operator+= (const string& str);
  • += 一个C风格的字符串:string& operator+= (const char* s);
  • += 一个字符:string& operator+= (char c);

使用示例:

void test_modify_1()
{	
	std::string str1("hello ");
	std::string str2("world");

	std::cout << "str1: " << str1 << std::endl;
	std::cout << "str2: " << str2 << std::endl << std::endl;

	//+= 一个字符串:string& operator+= (const string & str);
	str1 += str2;
	std::cout << "after -> str1 += str2" << std::endl;
	std::cout << "str1: " << str1 << std::endl << std::endl;

	//+= 一个C风格的字符串:string & operator+= (const char* s);
	str1 += " and C++";
	std::cout << "after -> str1 += \"and C++\"" << std::endl;
	std::cout << "str1: " << str1 << std::endl << std::endl;

	//+= 一个字符:string & operator+= (char c);
	str1 += '!';
	std::cout << "after -> str1 += \'!\'" << std::endl;
	std::cout << "str1: " << str1 << std::endl << std::endl;
}

int main()
{
	test_modify_1();

	return 0;
}

运行结果:
str1: hello
str2: world

after -> str1 += str2
str1: hello world

after -> str1 += "and C++"
str1: hello world and C++

after -> str1 += '!'
str1: hello world and C++!

2.追加函数append

函数原型:

  • 追加一个字符串:string& append(const string & str);
  • 追加一个字符串的子串:string& append(const string & str, size_t subpos, size_t sublen);
  • 追加一个C风格的字符串:string & append(const char* s);
  • 追加C风格字符串的前n个:string& append(const char* s, size_t n);
  • 追加n个相同的字符串:string& append(size_t n, char c);

使用示例:

void test_modify_2()
{
	std::string str1("hello");
	std::string str2(" world");

	std::cout << "str1: " << str1 << std::endl;
	std::cout << "str2: " << str2 << std::endl << std::endl;

	// 追加一个字符串:string& append(const string & str);
	str1.append(str2);
	std::cout << "after -> str1.append(str2)" << std::endl;
	std::cout << "str1: " << str1 << std::endl << std::endl;

	// 追加一个字符串的子串:string& append(const string & str, size_t subpos, size_t sublen);
	str1.append(str2,0,6);
	std::cout << "after -> str1.append(str2,0,3)" << std::endl;
	std::cout << "str1: " << str1 << std::endl << std::endl;

	// 追加一个C风格的字符串:string & append(const char* s);
	str2.append(" peace");
	std::cout << "after -> str2.append(\"peace\")" << std::endl;
	std::cout << "str2: " << str2 << std::endl << std::endl;

	// 追加C风格字符串的前n个:string& append(const char* s, size_t n);
	str1.append("yes or no",3);
	std::cout << "after -> str1.append(\"yes or no\",3)" << std::endl;
	std::cout << "str1: " << str1 << std::endl << std::endl;

	// 追加n个相同的字符串:string& append(size_t n, char c);
	str1.append(5, 'Y');
	std::cout << "after -> str1.str1.append(5, 'Y')" << std::endl;
	std::cout << "str1: " << str1 << std::endl << std::endl;
}

int main()
{
	test_modify_2();

	return 0;
}

运行结果:
str1: hello
str2:  world

after -> str1.append(str2)
str1: hello world

after -> str1.append(str2,0,3)
str1: hello world world

after -> str2.append("peace")
str2:  world peace

after -> str1.append("yes or no",3)
str1: hello world worldyes

after -> str1.str1.append(5, 'Y')
str1: hello world worldyesYYYYY

3.尾插

函数原型:

  • 尾插一个字符:void push_back (char c);

使用示例:

void test_modify_3()
{
	std::string str("prisin");
	std::cout << "str: " << str << std::endl << std::endl;

	// 尾插一个字符:void push_back (char c);
	str.push_back('g');
	std::cout << "after -> str.push_back('g')" << std::endl;
	std::cout << "str: " << str << std::endl;
}

int main()
{
	test_modify_3();

	return 0;
}

运行结果:
str: prisin

after -> str.push_back('g')
str: prising

4.尾删

函数原型:

  • void pop_back();

使用示例:

void test_pop_back()
{
	std::string str("hello");
	std::cout << "str: " << str << std::endl; 

	str.pop_back();
	std::cout << "str: " << str << std::endl;
}

int main()
{
	test_pop_back();

	return 0;
}

运行结果:
str: hello
str: hell

5.重新赋值

函数原型:

  •     用字符串重新赋值:string& assign(const string & str);
  •     用一个字符串的子串重新赋值:string& assign(const string & str, size_t subpos, size_t sublen);
  •     用C风格的字符串重新赋值:string & assign(const char* s);
  •     用C风格的字符串的前n个重新赋值:string& assign(const char* s, size_t n);
  •     用n个相同字符重新赋值:string& assign(size_t n, char c);

使用示例:

void test_modify_4()
{
	std::string str1("hello world");
	std::string str2("hello string");

	std::cout << "str1: " << str1 << std::endl;
	std::cout << "str2: " << str2 << std::endl << std::endl;

	//用字符串重新赋值:string& assign(const string & str);
	str1.assign(str2);
	std::cout << "after -> str1.assign(str2)" << std::endl;
	std::cout << "str1: " << str1 << std::endl << std::endl;

	//用一个字符串的子串重新赋值:string& assign(const string & str, size_t subpos, size_t sublen);
	str2.assign(str1,5,6);
	std::cout << "after -> str2.assign(str1,6,6)" << std::endl;
	std::cout << "str2: " << str2 << std::endl << std::endl;

	//用C风格的字符串重新赋值:string & assign(const char* s);
	str2.assign("hello C++");
	std::cout << "after -> str2.assign(\"hello C++\")" << std::endl;
	std::cout << "str2: " << str2 << std::endl << std::endl;

	//用C风格的字符串的前n个重新赋值:string& assign(const char* s, size_t n);
	str2.assign("hello ");
	std::cout << "after -> str2.assign(\"hello\")" << std::endl;
	std::cout << "str2: " << str2 << std::endl << std::endl;

	//用n个相同字符重新赋值:string& assign(size_t n, char c);
	str2.assign(5,'h');
	std::cout << "after -> str2.assign(5,\'h\')" << std::endl;
	std::cout << "str2: " << str2 << std::endl << std::endl;
}

int main()
{
	test_modify_4();

	return 0;
}

运行结果:
str1: hello world
str2: hello string

after -> str1.assign(str2)
str1: hello string

after -> str2.assign(str1,6,6)
str2:  strin

after -> str2.assign("hello C++")
str2: hello C++

after -> str2.assign("hello")
str2: hello

after -> str2.assign(5,'h')
str2: hhhhh

6.插入

函数原型:

  • 在pos位置插入一个字符串:string& insert (size_t pos, const string& str);
  • 在pos位置插入一个字符串的子串:string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
  • 在pos位置插入一个C风格的字符串:string& insert (size_t pos, const char* s);
  • 在pos位置插入C风格的字符串的前n个:string& insert (size_t pos, const char* s, size_t n);
  • 在pos位置插入n个相同的字符:string& insert (size_t pos, size_t n, char c);
  • 在迭代器p的位置插入n个相同的字符:void insert (iterator p, size_t n, char c);
  • 在迭代器p的位置插入一个字符:iterator insert (iterator p, char c);

使用示例:

void test_modify_5()
{
	// 在pos位置插入一个字符串:string& insert (size_t pos, const string& str);
	std::string str("hello string");
	std::string t1("C++ ");

	std::cout << "str: " << str << std::endl;
	std::cout << "t1: " << t1 << std::endl;

	str.insert(6,t1);
	std::cout << "after -> str.insert(6,t)" << std::endl;
	std::cout << "str: " << str << std::endl << std::endl;

	// 在pos位置插入一个字符串的子串:string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
	std::string t2("hello world ");

	std::cout << "str: " << str << std::endl;
	std::cout << "t2: " << t2 << std::endl;

	str.insert(10, t2, 6, 6);
	std::cout << "after -> str.insert(10, t2, 6, 5)" << std::endl;
	std::cout << "str: " << str << std::endl << std::endl;

	// 在pos位置插入一个C风格的字符串:string& insert (size_t pos, const char* s);
	str.assign("hello string");
	std::cout << "str: " << str << std::endl;

	str.insert(6, "C++ ");
	std::cout << "after -> str.insert(6, \"C++\")" << std::endl;
	std::cout << "str: " << str << std::endl << std::endl;

	// 在pos位置插入C风格的字符串的前n个:string& insert (size_t pos, const char* s, size_t n);
	std::cout << "str: " << str << std::endl;
	str.insert(10, "hello world", 6);

	std::cout << "after -> str.insert(10, \"hello world\", 5)" << std::endl;
	std::cout << "str: " << str << std::endl << std::endl;

	// 在pos位置插入n个相同的字符:string& insert (size_t pos, size_t n, char c);
	str.assign("hello string");
	std::cout << "str: " << str << std::endl;

	str.insert(6, 5, 'H');
	std::cout << "after -> str.insert(6, 5, \'H\')" << std::endl;
	std::cout << "str: " << str << std::endl << std::endl;

	// 在迭代器p的位置插入n个相同的字符:void insert (iterator p, size_t n, char c);
	str.assign("hello string");
	std::cout << "str: " << str << std::endl;

	std::string::iterator p = str.begin();
	str.insert(p, 5, 'X');

	std::cout << "after -> str.insert(p, 5, \'X\')" << std::endl;
	std::cout << "str: " << str << std::endl << std::endl;

	// 在迭代器p的位置插入一个字符:iterator insert (iterator p, char c);
	str.assign("hello string");
	std::cout << "str: " << str << std::endl;

	std::string::iterator it = str.begin();
	str.insert(it, 'X');

	std::cout << "after -> str.insert(it, \'X\')" << std::endl;
	std::cout << "str: " << str << std::endl << std::endl;
}

int main()
{
	test_modify_5();

	return 0;
}

运行结果:
str: hello string
t1: C++
after -> str.insert(6,t)
str: hello C++ string

str: hello C++ string
t2: hello world
after -> str.insert(10, t2, 6, 5)
str: hello C++ world string

str: hello string
after -> str.insert(6, "C++")
str: hello C++ string

str: hello C++ string
after -> str.insert(10, "hello world", 5)
str: hello C++ hello string

str: hello string
after -> str.insert(6, 5, 'H')
str: hello HHHHHstring

str: hello string
after -> str.insert(p, 5, 'X')
str: XXXXXhello string

str: hello string
after -> str.insert(it, 'X')
str: Xhello string

7.删除

函数原型:

  • 从pos位置开始删除指定长度:string& erase (size_t pos = 0, size_t len = npos);
  • 删除迭代器p位置的字符:iterator erase (iterator p);
  • 删除迭代器区间中的字符:iterator erase (iterator first, iterator last);

使用示例:

void test_modify_6()
{
	// 从pos位置开始删除指定长度:string& erase (size_t pos = 0, size_t len = npos);
	std::string str("hello C++ string");
	std::cout << "str: " << str << std::endl;

	str.erase(6, 3);

	std::cout << "after -> str.erase(6, 3)" << std::endl;
	std::cout << "str: " << str << std::endl << std::endl;

	// 删除迭代器p位置的字符:iterator erase (iterator p);
	str = "hello C string";
	std::cout << "str: " << str << std::endl;

	std::string::iterator it = str.begin() + 6;
	str.erase(it);

	std::cout << "after -> str.erase(it)" << std::endl;
	std::cout << "str: " << str << std::endl << std::endl;

	// 删除迭代器区间中的字符:iterator erase (iterator first, iterator last);
	str = "hello C++ string";
	std::cout << "str: " << str << std::endl;

	std::string::iterator start = str.begin() + 6;
	std::string::iterator end = str.begin() + 10;

	str.erase(start,end);

	std::cout << "after -> str.erase(start,end)" << std::endl;
	std::cout << "str: " << str << std::endl << std::endl;
}

int main()
{
	test_modify_6();

	return 0;
}

运行结果:
str: hello C++ string
after -> str.erase(6, 3)
str: hello  string

str: hello C string
after -> str.erase(it)
str: hello  string

str: hello C++ string
after -> str.erase(start,end)
str: hello string

8.查找

函数原型:

  • 从指定位置查找一个字符串:size_t find(const string & str, size_t pos = 0) const;
  • 从指定位置查找一个C风格的字符串:size_t find(const char* s, size_t pos = 0) const;
  • 从指定位置查找C风格的字符串的子串:size_t find(const char* s, size_t pos, size_t n) const;
  • 从指定位置查找一个字符:size_t find(char c, size_t pos = 0) const;
void test_find()
{
	//从指定位置查找一个字符串:size_t find(const string & str, size_t pos = 0) const;
	std::string str("hello C++ string");
	std::string t("C++");
	std::cout << "str: " << str << std::endl;
	std::cout << "t: " << t << std::endl;
	
	size_t pos = str.find(t);
	std::cout << "after -> str.find(t)" << std::endl;
	std::cout << "the first pos: " << pos << std::endl << std::endl;

	//从指定位置查找一个C风格的字符串:size_t find(const char* s, size_t pos = 0) const;
	str = "hello C++ string";

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

	pos = str.find("C++");
	std::cout << "after -> str.find(\"C++\")" << std::endl;
	std::cout << "the first pos: " << pos << std::endl << std::endl;

	//从指定位置查找C风格的字符串的子串:size_t find(const char* s, size_t pos, size_t n) const;
	str = "hello C++ string";
	std::cout << "str: " << str << std::endl;

	pos = str.find("string",0,3);
	std::cout << "after -> str.find(\"string\",0,3)" << std::endl;
	std::cout << "the first pos: " << pos << std::endl << std::endl;

	//从指定位置查找一个字符:size_t find(char c, size_t pos = 0) const;
	str = "hello C++ string";
	std::cout << "str: " << str << std::endl;

	pos = str.find('C',0);
	std::cout << "after -> str.find(\'C\',0)" << std::endl;
	std::cout << "the first pos: " << pos << std::endl << std::endl;
}

int main()
{
    test_find();

    return 0;
}

运行结果:
str: hello C++ string
t: C++
after -> str.find(t)
the first pos: 6

str: hello C++ string
after -> str.find("C++")
the first pos: 6

str: hello C++ string
after -> str.find("string",0,3)
the first pos: 10

str: hello C++ string
after -> str.find('C',0)
the first pos: 6

9.交换两个字符串

函数原型:

  • void swap (string& str);

使用示例:

void test_modify_7()
{
	std::string str1("hello");
	std::string str2("world");

	std::cout << "str1: " << str1 << std::endl;
	std::cout << "str2: " << str2 << std::endl;

	str1.swap(str2);

	std::cout << "str1: " << str1 << std::endl;
	std::cout << "str2: " << str2 << std::endl;
}

int main()
{
	test_modify_7();

	return 0;
}

运行结果:
str1: hello
str2: world
str1: world
str2: hello

五、字符串的其他操作

1.获取C风格的字符串

函数原型:

  • const char* c_str() const;

使用示例:

void test_1()
{
	std::string str("hello c string");

	auto p = str.c_str();
	std::cout << typeid(p).name();
}

int main()
{
	test_1();

	return 0;
}

运行结果:
char const *

2.复制字符串中的指定内容

函数原型:

  • size_t copy (char* s, size_t len, size_t pos = 0) const;

使用示例:

void test_2()
{
	std::string str("hello string");

	char buffer[20];
	str.copy(buffer, 6, 6);
	buffer[6] = '\0';

	std::cout << buffer;
}

int main()
{
	test_2();

	return 0;
}

运行结果:
string

3.提取子串

函数原型:

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

使用示例:

void test_substr()
{
	// 从指定位置提取指定位置的子串:string substr (size_t pos = 0, size_t len = npos) const;
	std::string str("hello C++ string");
	std::cout << "str: " << str << std::endl;
	
	std::string sub_str = str.substr(6, 3);
	std::cout << "after -> str.substr(6, 3)" << std::endl;
	std::cout << "sub_str: " << sub_str << std::endl;
}

int main()
{
    test_substr();
    return 0;
}

运行结果:
str: hello C++ string
after -> str.substr(6, 3)
sub_str: C++

4.+操作符重载

函数原型:

  • 字符串+字符串:string operator+ (const string& lhs, const string& rhs);
  • 字符串+C风格的字符串:string operator+ (const string& lhs, const char*   rhs);
  • C风格的字符串+字符串:string operator+ (const char*   lhs, const string& rhs);
  • 字符串+字符:string operator+ (const string& lhs, char rhs);
  • 字符+字符串:string operator+ (char lhs, const string& rhs);

使用示例:

void test_operator_add()
{
	// 字符串+字符串:string operator+ (const string& lhs, const string& rhs);
	std::string str1("hello");
	std::string str2(" string");
	std::cout << "str1: " << str1 << std::endl;
	std::cout << "str2: " << str2 << std::endl;

	std::string str3 = str1 + str2;
	std::cout << "after -> str3 = str1 + str2" << std::endl;
	std::cout << "str3: " << str3 << std::endl << std::endl;

	// 字符串+C风格的字符串:string operator+ (const string& lhs, const char*   rhs)
	std::string str4("hello");

	std::cout << "str4: " << str4 << std::endl;

	std::string str5 = str4 + " string";
	std::cout << "after -> str5 = str4 +\"string\"" << std::endl;
	std::cout << "str5: " << str5 << std::endl << std::endl;

	// C风格的字符串+字符串:string operator+ (const char*   lhs, const string& rhs);
	std::string str6("string");

	std::cout << "str6: " << str6 << std::endl;

	std::string str7 = "hello " + str6;
	std::cout << "after -> str7 = \"hello \" + str6" << std::endl;
	std::cout << "str7: " << str7 << std::endl << std::endl;

	// 字符串+字符:string operator+ (const string& lhs, char rhs);
	std::string str8("hello ");

	std::cout << "str8: " << str8 << std::endl;

	std::string str9 = str8 + 'C';
	std::cout << "after -> str9 = str8 + \'C\'" << std::endl;
	std::cout << "str9: " << str9 << std::endl << std::endl;

	// 字符+字符串:string operator+ (char lhs, const string& rhs);
	std::string str10(" string");

	std::cout << "str10: " << str10 << std::endl;

	std::string str11 = 'C'+str10;
	std::cout << "after -> str11 = \'C\'+str10" << std::endl;
	std::cout << "str11: " << str11 << std::endl << std::endl;
}

int main()
{
    test_operator_add();
    return 0;
}

运行结果:
str1: hello
str2:  string
after -> str3 = str1 + str2
str3: hello string

str4: hello
after -> str5 = str4 +"string"
str5: hello string

str6: string
after -> str7 = "hello " + str6
str7: hello string

str8: hello
after -> str9 = str8 + 'C'
str9: hello C

str10:  string
after -> str11 = 'C'+str10
str11: C string

5.获取一行

函数原型:

  • istream& getline(istream & is, string & str);

使用示例:

void test_getline()
{
	// 获取一行:istream& getline(istream & is, string & str);
	std::string str;
	std::getline(std::cin,str); // 输入:hello C++ string

	std::cout << "str: " << str << std::endl;
}

int main()
{
	test_getline();

	return 0;
}

运行结果:
hello C++ string
str: hello C++ string

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

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

相关文章

基于STM32的八位数码管显示Proteus仿真设计

基于STM32的八位数码管显示Proteus仿真设计 1.主要功能2.仿真设计3. 程序设计4. 设计报告5. 资料清单&下载链接 基于STM32的八位数码管显示Proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;…

Linux grep命令详解(多图、多示例)

文章目录 grep基本说明grep参数简单示例列举参数-v(反选)-r -l -H -i(目录子目录、只打印匹配文件、输出文件名、忽略大小写)-c -n -o(匹配次数、输出行号、只打印匹配)-A -B -C(前后行) 正则表达式基本正则表达式与扩展正则表达式 grep示例附录:正则表达式基本字符特殊字符Per…

力扣:225 用队列实现栈

栈、队列 栈&#xff1a; 弹夹&#xff0c;后进先出 队列&#xff1a; 排队&#xff0c;先进先出 描述&#xff1a; var MyStack function () {// 定义两个数组&#xff0c;模拟队列this.queue []this._queue [] };/** * param {number} x* return {void}*/ MyStack.protot…

【MFC编程(一)】MFC概述

文章目录 MFC概述MFC组成MFC对比Windows APIMFC类库基类CObject命令发送类CCmdTarget应用程序结构类应用程序线程支持类CWinThread/CWinApp文档类CDocument文档模板类CDocTemplate 窗口类窗口基类CWnd边框窗口类CFrameWnd视图类CView MFC概述 MFC&#xff08;Microsoft Founda…

【客观理性深入讨论国产中间件及数据库-科创基础软件】

随着国产化的进程&#xff0c;越来越多的国企央企开始要求软件产品匹配过程化的要求&#xff0c; 最近有一家银行保险的科技公司对行为验证码产品就要求匹配国产中间件&#xff0c; 于是开始了解国产中间件都有哪些厂家 一&#xff1a;国产中间件主要产品及厂商 1 东方通&…

基于Python的校园爱心帮扶管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

pycharm小游戏贪吃蛇及pygame模块学习()

由于代码量大&#xff0c;会逐渐发布 一.pycharm学习 在PyCharm中使用Pygame插入音乐和图片时&#xff0c;有以下这些注意事项&#xff1a; 插入音乐&#xff1a; - 文件格式支持&#xff1a;Pygame常用的音乐格式如MP3、OGG等&#xff0c;但MP3可能需额外安装库&#xf…

A018基于Spring Boot的民宿租赁系统

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

​基于学习的地铁客流动态预测智能调度方法

1 文章信息 文章题为“A Learning Based Intelligent Train RegulationMethod With Dynamic Prediction forthe Metro Passenger Flow”&#xff0c;该文于2023年发表至“IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS”。文章的核心观点是提出了一种基于学习的智…

SpringBoot+FileBeat+ELK8.x版本收集日志

一、准备环境 1、ElasticSearch&#xff1a;8.1.0 2、FileBeat&#xff1a;8.1.0 3、Kibana&#xff1a;8.1.0 4、logstach&#xff1a;8.1.0 本次统一版本&#xff1a;8.1.0,4个组件&#xff0c;划分目录&#xff0c;保持版本一致。 说明&#xff1a;elasticsearch和kib…

【大数据学习 | HBASE】habse的表结构

在使用的时候hbase就是一个普通的表&#xff0c;但是hbase是一个列式存储的表结构&#xff0c;与我们常用的mysql等关系型数据库的存储方式不同&#xff0c;mysql中的所有列的数据是按照行级别进行存储的&#xff0c;查询数据要整个一行查询出来&#xff0c;不想要的字段也需要…

论文速读:动态再训练-更新用于无源目标检测的Mean Teacher(ECCV2024)

原文标题&#xff1a;Dynamic Retraining-Updating Mean Teacher for Source-Free Object Detection 中文标题&#xff1a;动态再训练-更新用于无源目标检测的Mean Teacher 本篇文章为论文速读&#xff0c;以帮助大家快速了解大意&#xff0c;具体详解可以看这篇分享。ECCV2024…

科研绘图系列:R语言带有面积区域的折线图(linechart)

文章目录 介绍加载R包数据画图准备图1图2图3图4图5图6图7图8图9图10合并所有图形系统信息介绍 带有面积区域的折线图通常被称为面积图(Area Chart)。面积图结合了折线图和条形图的特点,通过在折线下方的区域填充颜色或纹理,来展示一个或多个组的数值如何随第二个变量(通常…

Golang--文件操作

1、文件 文件&#xff1a;文件用于保存数据&#xff0c;是数据源的一种 os包下的File结构体封装了对文件的操作&#xff08;记得包os包&#xff09; 2、File结构体--打开文件和关闭文件 2.1 打开文件 打开文件&#xff0c;用于读取&#xff08;函数&#xff09;&#xff1a; 传…

Ubuntu学习笔记 - Day3

文章目录 学习目标&#xff1a;学习内容&#xff1a;学习笔记&#xff1a;vim简介vim键盘图工作模式 vim移动光标操作上下左右移动翻页 vim替换和删除操作替换删除 vim插入模式详解进入模式搜索 vim底行模式操作保存退出行号 学习目标&#xff1a; 一周掌握 Linux基本使用技巧 …

Java中的JDBC的详解

数据库驱动包 Java提出的一套关于数据库操作的接口 各个数据库厂商要把自己的api对接到/适配到jdbc上 程序员只需要掌握一套api就可以操作不同的数据库了 数据库厂商提供的这个原生api适配到jdbc转换程序&#xff0c;称为“数据库驱动包” 1&#xff09;创建数据源 //1,创…

Apache-Hive数据库使用学习

前期准备 Hadoop-分布式部署&#xff08;服务全部在线&#xff09; Mysql-node1节点部署&#xff08;确认安装正常&#xff09; apache-hive -node1节点部署&#xff08;需要与MySQL元数据联动存储&#xff09; 参考博客&#xff1a; Hadoop Hadoop集群搭建-完全分布式_hadoop完…

【极客兔兔-Web框架Gee详解】Day2 上下文Context

文章目录 一、框架结构二、设计上下文(Context):day2-context/gee/context.go1. 设计Context必要性1.1 接口粒度过细:1.2 缺乏扩展性:2. 代码3. 优势三、路由(Router): day2-context/gee/router.go四、框架入口:day2-context/gee/gee.go1. 代码五、框架使用: day2-context/m…

LeetCode17. 电话号码的字母组合(2024秋季每日一题 59)

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits “23” 输出&#xff1a;[“…

DApp开发定制:合约设计与源码搭建支持快速上线

随着区块链技术的飞速发展&#xff0c;去中心化应用&#xff08;DApp&#xff09;已经成为区块链生态中不可或缺的一部分。DApp不仅改变了传统互联网应用的运作方式&#xff0c;还通过去中心化的理念和智能合约的支持&#xff0c;赋能了用户和开发者。无论是金融、游戏、社交、…