当前位置: 首页 > wzjs >正文

怎样建设网站是什么网络营销的特点主要有哪些

怎样建设网站是什么,网络营销的特点主要有哪些,新手小白学编程,怎么推广我的网站吗个人主页:NiKo C专栏:C程序设计 目录 一、标准库中的string类 1、string类 2、string的构造方法 二、string的遍历 1、auto和范围for(C11支持) 补充auto的相关语法: 范围for: 2、迭代器(iterator…

个人主页:NiKo 

C++专栏:C++程序设计

目录

一、标准库中的string类

1、string类

2、string的构造方法

二、string的遍历

1、auto和范围for(C++11支持)

补充auto的相关语法:

范围for:

2、迭代器(iterator)

正向迭代器

反向迭代器

3、operator[]

三、string容量

1、length和size

2、capacity

3、reserve

四、string修改

1、push_back

2、append

3、operator+=

 4、insert

5、erase


一、标准库中的string类

1、string类

        C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。 

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

#include <string>
using namespace std;

2、string的构造方法

string一共有5种构造方法。

  • string()
  • 无参构造,初始化为空串
​string str1;                   //空串

  • string(const string& str)
  •  用str拷贝构造

string str2("hello world");   //用"hello world"拷贝构造str2

  • string(size_t n,char c)
  • 用n个字符c初始化
string str3(4, 'a');          //用4个字符'a'初始化

  • string(const char* s,size_t n)
  • 用字符串s的前n个字符初始化
string str4("hello world", 5);     //用字符串"hello world" 前5个字符初始化

  • string(const string& str,size_t pos,size_t len=npos)
  • 将字符串str,从下标pos位置开始,选取长度为len个的字符,来初始化
  • 注:上面的缺省值npos,定义为:size_t npos=-1. npos为最大值,表示不传参数时,会用str中pos位置开始后的所有字符来初始化
string str5(str2, 5, 6); //用str2中,从下标为5位置开始,长度为6的字符串初始化

二、string的遍历

1、auto和范围for(C++11支持)

补充auto的相关语法:

        1、在早期C/C++auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个不重要了。C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得

int a = 10;
auto b = a;
auto c = 'a';
auto d = func1(); //auto会自动推导变量的类型auto e; // 编译报错:rror C3531: “e”: 类型包含“auto”的符号必须具有初始值设定项
(必须初始化)cout << typeid(b).name() << endl;    //int
cout << typeid(c).name() << endl;    //char
cout << typeid(d).name() << endl;    //int

        2、用auto声明指针类型时,用autoauto*没有任何区别,但用auto声明引用类型时则必须加&;当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量

int x = 10;
auto y = &x;
auto* z = &x;    //用auto声明指针类型时,用auto和auto*没有任何区别
auto& m = x;     //用auto声明引用类型时则必须加&cout << typeid(x).name() << endl;    //int
cout << typeid(y).name() << endl;    //int*
cout << typeid(z).name() << endl;    //int*auto aa = 1, bb = 2;//当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错auto cc = 3, dd = 4.0;// 编译报错:error C3538: 在声明符列表中,“auto”必须始终推导为同一类型

        3、auto不能作为函数的参数,可以做返回值,但是建议谨慎使用

// 不能做参数 error:报错
void func2(auto a)
{}// 可以做返回值,但是建议谨慎使用(建议不要使用)
auto func3()
{return 3;
}

        4、auto不能直接用来声明数组

// 编译报错:error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型
auto array[] = { 4, 5, 6 };

        5、auto的用武之地
std::map<std::string, std::string> dict = { { "apple", "苹果" },{ "orange",
"橙子" }, {"pear","梨"} };//auto的用武之地:在某些情况下,可以减小代码书写的难度,例如迭代器的定义//写法一:
std::map<std::string, std::string>::iterator it = dict.begin();//写法二:
auto it = dict.begin();

范围for:

        对于一个有范围的集合 而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的 for 循环。 for 循环后的括号由冒号 分为两部分:第一部分是范围 内用于迭代的变量,第二部分则表示被迭代的范围 ,自动迭代,自动取数据,自动判断结束。范围for 可以作用到数组和容器对象上进行遍历。
int array[] = { 1, 2, 3, 4, 5 };
// C++98的遍历
for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
{cout << array[i] << endl; // 1 2 3 4 5
}// C++11的遍历
for (auto& e : array)e *= 2;    // 如果要修改容器内的元素,需要在变量类型后加上&
for (auto e : array)cout << e << " " << endl; // 2 4 6 8 10// 字符串的遍历
string str("hello world");
for (auto ch : str)
{cout << ch << " "; // h e l l o  w o r l d
}
cout << endl;

2、迭代器(iterator)

  • string 中的迭代器主要分为正向迭代器反向迭代器,其中又可以细分为 const 和 非const类型的,共计四种。
  • const迭代器仅定义方式与非const不同,且在循环内部不能对元素进行修改,其余的都相同
begin + end
begin 获取第一个字符的迭代器 + end 获取最后一个字符下一个位 置的迭代器('\0')
rbegin + rend
rend 获取第一个字符的前一个位置迭代器 + rbegin获取最后一个字符下一个位置的迭代器

正向迭代器

  • 非const
string str("hello world");/*
* 步骤:1.获取容器开头的迭代器2.以容器结尾的迭代器作为循环结束条件3.通过*(迭代器变量名)获取容器内部的元素4.移动迭代器的位置
*/// 或 auto sit = str.begin(); 
string::iterator sit = str.begin();	// 1
while (sit != str.end()) {			// 2cout << *sit << ' ';			// 3sit++;							// 4
}

  • const
string::const_iterator sit = str.begin();	// 1
while (sit != str.end()) {			// 2cout << *sit << ' ';			// 3sit++;							// 4
}

反向迭代器

  • 非const
string str("hello world");
/*
* 步骤:1.获取容器结尾的迭代器(rbegin)2.以容器开头的迭代器作为循环结束条件(rend)3.通过*(迭代器变量名)获取容器内部的元素4.移动迭代器的位置
*/
string::reverse_iterator sit = str.rbegin();	// 1
while (sit != str.rend()) {			// 2cout << *sit << ' ';			// 3sit++;							// 4
}

  • const
string::const_reverse_iterator sit = str.rbegin();	// 1
while (sit != str.rend()) {			// 2cout << *sit << ' ';			// 3sit++;							// 4
}

3、operator[]

  • 通过索引访问类中的字符数据
MyString str("Hello, World!");
str[0] = 'h'; // 修改第一个字符为'h'
str[7] = 'w'; // 修改第八个字符为'w'(将'W'改为小写)// 输出修改后的字符串
for (size_t i = 0; i < str.getLength(); ++i) {cout << str[i];
}cout << endl;    // hello world

三、string容量

1、length和size

  • 返回字符串中有效字符的长度
  • size()与length()方法底层实现原理完全相同,二者没有本质的区别,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
string str("hello world");
cout << "str length:" << str.length() << endl;
cout << "str size:" << str.size() << endl;//str length:11
//str size:11

2、capacity

  • 返回字符串存储有效字符的空间大小(不包含'\0')
string str("hello world");
cout << "str capacity:" << str.capacity() << endl;//str capacity:15(不包含'\0')
  • capacity的扩容机制

        capacity()在不同平台上的扩容方式不同。先展示Windows下capacity的扩容过程。

string s;
size_t sz = s.capacity();			// 记录最开始的容量
cout << "make s grow:" << endl;
cout << "init capacity:" << s.capacity() << endl;
for (int i = 0; i < 100; i++) {s.push_back('c');				// 每次向s中添加一个字符if (sz != s.capacity()) {sz = s.capacity();			// 判断容量是否变化并打印信息cout << "capacity changed:" << sz << endl;}
}/*
Windows result:make s grow:      (不包含'\0')        (包含'\0')init capacity:        15                 16capacity changed:     31                 32   capacity changed:     47                 48   capacity changed:     70                 71   capacity changed:     105                106运行环境:Windows11 VS2022
*/

        在Windows系统上,使用Visual Studio 2022编译器时,容器的capacity首次扩容遵循二倍增长策略(例如,从16扩展到32),而随后的扩容则调整为1.5倍增长。

        相比之下,在Linux系统上,当采用g++ 4.8编译器且演示代码保持完全一致的情况下,容器的初始capacity被设置为1,并且无论是首次还是后续的扩容操作,均严格遵循二倍增长模式。

/*
Linux result:make s grow:init capacity:        1                 capacity changed:     2                   capacity changed:     4                   capacity changed:     8                   capacity changed:     16capacity changed:     32capacity changed:     64capacity changed:     128                                    运行环境:Linux g++ 4.8
*/

3、reserve

  • 用于预分配足够的内存空间以容纳指定数量的字符。这个函数不会改变字符串的内容或长度,但它可以影响字符串的 capacity
string s;
s.reserve(100);                     // 提前扩容100个空间(不包含'\0')
size_t sz = s.capacity();			// 记录最开始的容量
cout << "make s grow:" << endl;
cout << "init capacity:" << s.capacity() << endl;
for (int i = 0; i < 100; i++) {s.push_back('c');				// 每次向s中添加一个字符if (sz != s.capacity()) {sz = s.capacity();			// 判断容量是否变化并打印信息cout << "capacity changed:" << sz << endl;}
}/*
Windows VS result:make s grow:init capacity:111Linux g++ result:make s grow:init capacity:100
*/

        reserve()函数在字符串管理中的主要作用是预分配足够的内存空间,以减少因后续操作(如添加字符)导致的频繁扩容,从而提升性能。这一功能在不同平台上可能因标准库实现的具体细节而有所差异。

        在Visual Studio环境下,当传入的参数n大于字符串当前的容量时,reserve()函数会确保字符串的容量增加至至少n个字符或更大。如果n小于或等于当前容量,调用reserve(n)通常不会有任何效果,因为字符串已经有足够的空间来存储n个字符。

        在Linux平台上,使用g++等编译器时,reserve()函数的行为通常与Visual Studio相似。当n大于当前容量时,它会将字符串的容量调整为至少n个字符。然而,与Visual Studio不同的是,在Linux平台上,如果n小于或等于当前容量,字符串的容量将会缩减(至少为size)。

四、string修改

1、push_back

  • void push_back (char c);
  • 在字符串的末尾添加一个字符
string myString = "Hello";
myString.push_back('!'); // 在字符串末尾添

2、append

  • ​​​​​​string& append (const string& str);
  • ​在字符串的末尾添加另一个字符串的内容
string myString = "Hello, ";
string appendedString = "world!";
myString.append(appendedString); // 在 myString 末尾添加 appendedString 的内容

3、operator+=

  • string& operator+= (const string& str);
  • 将右侧字符串的内容追加到左侧字符串的末尾
string greeting = "Hello";
string suffix = ", world!";
greeting += suffix; // 使用 += 运算符将 suffix 追加到 greeting 的末尾

 4、insert

  • string& insert (size_t pos, const string& str);
  • 在字符串的指定位置插入另一个字符串的内容
string myString = "Hello world";
string toInsert = ", beautiful ";
myString.insert(6, toInsert); // 在 myString 的第 6 个位置插入 toInsert 的内容

5、erase

  • string& erase (size_t pos = 0, size_t len = npos);
  • 从字符串中删除字符
string str = "Hello, World!";
str.erase(7, 5); // 从位置7开始删除5个字符

文章转载自:

http://X4Lu6vml.mLnbd.cn
http://I3JkLMpr.mLnbd.cn
http://G4GdHJ6V.mLnbd.cn
http://PaTIFWWK.mLnbd.cn
http://hiAhTVQ9.mLnbd.cn
http://mSvqUhCu.mLnbd.cn
http://5vU9ORU4.mLnbd.cn
http://Uc2g0yM9.mLnbd.cn
http://Q5zJcKwU.mLnbd.cn
http://qvSMkALH.mLnbd.cn
http://9qBdwF9K.mLnbd.cn
http://5DrVVH4Q.mLnbd.cn
http://CBAps1Jl.mLnbd.cn
http://srCNPcJ2.mLnbd.cn
http://fg7PK7DE.mLnbd.cn
http://2NZ8vywk.mLnbd.cn
http://onh5OkMu.mLnbd.cn
http://6JLQceHq.mLnbd.cn
http://8pj8U2VR.mLnbd.cn
http://08B930cJ.mLnbd.cn
http://DeLNXTkD.mLnbd.cn
http://obMFE65H.mLnbd.cn
http://8wsAbeih.mLnbd.cn
http://qFNv6kdH.mLnbd.cn
http://0WzXmKpJ.mLnbd.cn
http://aTwlQS5X.mLnbd.cn
http://k1JP0lgg.mLnbd.cn
http://hcfgUwDh.mLnbd.cn
http://8bh3wQrz.mLnbd.cn
http://Pw1BFK6y.mLnbd.cn
http://www.dtcms.com/wzjs/715297.html

相关文章:

  • 云南旅行社网站建设微信小程序商城怎样做
  • 做自己的网站要多少钱门头沟新乡网站建设
  • 上海seo网站建设怎么在广告联盟接广告
  • 福田企业的网站建设公司好吗网站的创建历程怎么写
  • 网站搭建设计 是什么江汉建站公司
  • 唐山建设集团下岗职工网站微商城网站建设报价
  • 制作网站网页北京建设管理有限公司官网
  • 基于php的个人网站设计论文工商网企业信息查询系统上海
  • 辽宁建设工程招标网站默认开启评论 wordpress
  • 聊城菜鸟网站建设公司网络技术网站是做什么的
  • 做网站费用记入什么会计科目交换链接营销的经典案例
  • 做养生网站需要什么资质无需代码制作app软件
  • 软件公司网站建设2008vps做网站
  • 简单的网站怎么做集团有限公司成立条件
  • 做家教去哪个网站互联网营销师报名
  • 龙岗建网站公司wordpress 增加小工具
  • 百姓网网站建设网络营销外包平台
  • 做网站需要钱吗wordpress 微信抓取
  • 营销型网站深度网中国多少个省份31个省
  • 迅速编程做网站青岛做网站的大公司有
  • python网站开发框架怎样帮拍卖网站做策划
  • 网站制作设计说明手机支付网站开发
  • 网站开发怎么进行数据库连接石家庄网站快速排名
  • 网站无法处理请求商城网站建设报价方案
  • 闲鱼网站是哪家公司做的深圳贸易网站建设
  • 怎么做家具定制网站网站名称和网址
  • 网站建设技术支持蔡甸网站建设
  • 西安php网站开发培训班电脑优化是什么意思
  • 做网站公司的收费多少北辰天津网站建设
  • 网站平台多少钱山东省最新消息今天