当前位置:网站首页 / C++ / 正文

AY的VS2019 的C++11笔记[2]

时间:2020年06月08日 | 作者 : aaronyang | 分类 : C++ | 浏览: 399次 | 评论 0


笔记【1】

 C++导入命名空间用using 

image.png

然后我在vs2019中,下面写法报错

image.png

会报错,建议还是使用上面第一种的写法

或者

image.png

这种写法(偏第一种)


头文件不应该包含using语句

标准库类型string

#include <string>

image.png

一个string好多东东

 image.png

image.png


string对象操作

image.png

注意输入:“   Hello world   ”

image.png

string对象会自动忽略开头的空白(空格符,换行符,制表符),从第一个字符读取,到下一个空白结束


image.png



getline读取一行

string line;
	while (getline(cin,line))
	{
			cout << line << endl;
	}

你输入什么,回车就会输出什么


empty() 判断是否为空返回bool

string line;
	while (getline(cin, line))
	{
		if (line.empty()) {
			cout << "不要输入空白字符" << endl;
		}
		else {
			cout << line << endl;
		}

	}

image.png

size()长度

image.png

结果乱码

换成这样就行了

cout <<"你输入了"<< line.size() <<"个字:"<<line << endl;

image.png

当然这样也行

image.png

我猜应该是size()是int类型的,跟string不能一起

string::size_type类型就是size()返回的。

现在C++11 ,你可以使用auto或者decltype

auto len=line.size(); 无符号



特别注意:

image.png

这样写会报错的,

image.png

这样写是对的

image.png

必须确保每个加法运算符(+)的两侧的运算的对象至少有一个是string


image.png

其他string的方法

image.png

char a2 = toupper('a');

cout << a2 << endl;

image.png



所以字符串,转换,只能一个一个字符串转

使用for(类型 对象名:字符串){}

image.png



接下来,我们把字符串 变成大写

image.png


统计标点


decltype(s.size()) psum = 0;

for (auto d:s)

{

if (ispunct(d)) {

psum++;

}

}

cout << "一共" << psum << "个标点符号" << endl;


image.png

结果字符串包括中文标点符号,就报错了。


百度: https://www.zhihu.com/question/41567259/answer/91532195



首字母大写

string dd("hello ay");
	if (!dd.empty()) {
		dd[0] = toupper(dd[0]);
	}
	cout <<dd<< endl;


第一个单词改成大写

for (decltype(dd.size()) index=0;index!=dd.size() && !isspace(dd[index]);++index)
	{
		dd[index] = toupper(dd[index]);
	}
	cout << dd << endl;

image.png



其他

char str1[10] = "Hello";
	char str2[10] = "World";
	char str3[10];
	int  len;

	// 复制 str1 到 str3
	strcpy_s(str3, str1);
	cout << "strcpy( str3, str1) : " << str3 << endl;

	// 连接 str1 和 str2
	strcat_s(str1, str2);
	cout << "strcat( str1, str2): " << str1 << endl;

	// 连接后,str1 的总长度
	len = strlen(str1);
	cout << "strlen(str1) : " << len << endl;


string str1 = "Hello";
string str2 = "World";
string str3;
int  len;

// 复制 str1 到 str3
str3 = str1;
cout << "str3 : " << str3 << endl;

// 连接 str1 和 str2
str3 = str1 + str2;
cout << "str1 + str2 : " << str3 << endl;

// 连接后,str3 的总长度
len = str3.size();
cout << "str3.size() :  " << len << endl;




看Vector,一个容器

#include <vector>


C++类模板,函数模板,vector是个类模板

(目前我也不太懂)

编译器根据模板创建类或者函数的过程叫 实例化

当使用模板时候,需要指出编译器应把类或函数实例化为何种类型

image.png

以前的C++标准,vector<vector<string> > 注意最后两个>中间有个空格

(有点像C#的泛型集合List<T>)


image.png

vector<string> stringlist = {"hello","world","ay"};

vector<string> s1e{10}; 这个特殊,10个空字符串等同于vector<string> s1e(10);


从网上搜了下

1 基本操作


(1)头文件#include<vector>.


(2)创建vector对象,vector<int> vec;


(3)尾部插入数字:vec.push_back(a);


(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。


(5)使用迭代器访问元素.


vector<int>::iterator it;for(it=vec.begin();it!=vec.end();it++)

cout<<*it<<endl;

(6)插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;


(7)删除元素:    vec.erase(vec.begin()+2);删除第3个元素


vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始


(8)向量大小:vec.size();


(9)清空:vec.clear();


2


vector的元素不仅仅可以使int,double,string,还可以是结构体,但是要注意:结构体要定义为全局的,否则会出错。下面是一段简短的程序代码:

#include<stdio.h>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
 
typedef struct rect
{    int id;    int length;    int width;
 
  //对于向量元素是结构体的,可在结构体内部定义比较函数,下面按照id,length,width升序排序。
  bool operator< (const rect &a)  const
    {
        if(id!=a.id)
            return id<a.id;
        else
        {
            if(length!=a.length)
                return length<a.length;
            else
                return width<a.width;
        }
    }
}Rect;int main()
{
    vector<Rect> vec;
    Rect rect;
    rect.id=1;
    rect.length=2;
    rect.width=3;
    vec.push_back(rect);
    vector<Rect>::iterator it=vec.begin();
    cout<<(*it).id<<' '<<(*it).length<<' '<<(*it).width<<endl;    return 0;
 
}

3  算法


(1) 使用reverse将元素翻转:需要头文件#include<algorithm>


reverse(vec.begin(),vec.end());将元素翻转(在vector中,如果一个函数中需要两个迭代器,


一般后一个都不包含.)


(2)使用sort排序:需要头文件#include<algorithm>,


sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).


可以通过重写排序比较函数按照降序比较,如下:


定义排序比较函数:


bool Comp(const int &a,const int &b)

{

    return a>b;

}

调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。




输入字符放入vector,然后遍历器输出

string word;
	vector<string> v;
	while (cin >> word) {
		if (word == "q") {
			break;
		}
		else {
			v.push_back(word);
		}
	}
	vector<string>::iterator iter;
	for (iter = v.begin(); iter != v.end(); iter++) {
		cout << *iter << endl;
	}

image.png


继续增加判断

        if (v.empty()) {
		cout << "空队列" << endl;
	}
	else {
		cout << "非空队列" <<v.size()<< endl;
	}


这里有迭代器

现在看string类型自带的迭代器,下面的首字母大写

string test1 = "helloworld";
	if (test1.begin() != test1.end()) {
		auto b1 = test1.begin();
		*b1 = toupper(*b1);
	}
	cout << test1 << endl;

换第一个单词为大写

string test1 = "hello world";
	/*if (test1.begin() != test1.end()) {
		auto b1 = test1.begin();
		*b1 = toupper(*b1);
	}
	cout << test1 << endl;*/

	for (auto aa=test1.begin();aa!=test1.end() && !isspace(*aa);++aa)
	{
		*aa = toupper(*aa);
	}
	cout << test1 << endl;


image.png


迭代器运算

*iter  返回 当前元素

iter-> mem  mem是一个属性,例如C#类中的 student.Name属性   这里iter就是 foreach的item,mem就是Name属性。等价于(*iter).mem,这里也可以直接方法 iter -> empty()

++iter,就是下一个元素

--iter上一个元素

iter1==iter2两个迭代器是否相等

iter1!=iter2两个迭代器是否不相等


这里知识和C#的泛型和foreach有点像


迭代器类型

image.png

迭代器和常量迭代器,常量只能读元素


看begin()返回

image.png

如果对象只需读操作无写,最好使用常量类型,

C++11 提供了,cbegin,cend();

image.png

迭代器的运算 ,你自己理解为 int的加减吧,就是移动位置,到第几个元素



比如中间位置

auto mid=v1.begin()+v1.size()/2;

测试了 非整数

vector<int> values{ 10,20,30,40,50,60,70,80,90 };

image.png

这里4.5就是取整数4





数组

C++的方括号,在变量名后面

int aaa[10] 

下面,sz是 10个整型指针

image.png

不能用auto,必须具体类型

	int d1[] = { 11,21,31,41 };
	int d2[5] = { 11,21,31,41 };//等于 	int d2[5] = { 11,21,31,41,0};
	string d3[5] = { "hello","xx","aax" };//等于 string d3[5] = { "hello","xx","aax","","" };

字符串特殊的写法

	char ad1[] = {'h','e','\0'};
	char ad2[] = "helloworld";
	const char ad3[] = "helloworld";

数组不允许将数组的内容拷贝给其他数组作为初始值,也不能赋值

int a[]={1,2,3};

int b[]=a;//错误的

b=a;//错误的


复杂的数组声明

image.png

这样不会错哦

image.png

这个报错

image.png

就是这个值必须是常量const或者constexpr




指针和数组的混用,默认指针指向数组的第一个值位置

int p1[10] = { 1,2,3,4,5,6,7,8,9,12 };//10个整型指针的数组
	int* p = p1;
	*p = 100;
	cout << p1[0] << endl;

	int* ptr = &p1[1];
	*ptr = 3200;
	cout << p1[1] << endl;

image.png

发现个奇怪的,

image.png

ptr[0]是3200,ptr[1]是3

所以可以这么理解,ptr就是一个位置记录, 0就是当前指向的对象,然后1,就是下一个,以此类推



指针也是迭代器

加减运算

image.png


获得不存在的尾元素遍历,这里p2[10] 这个元素不存在的

int* endp2 = &p2[10];
	for (int* begin=p2; begin!=endp2; begin++)
	{
		cout << *begin << endl;
	}

当然也提供了begin ,end

image.png


指针加减一个值,还是指针,


image.png

长度就是相减。


image.png

 指针直接-2,,等于3

image.png

这是下标运算,vector也支持。






 AYUI       www.ayjs.net      AY         杨洋原创编写,请不要转载谢谢

















推荐您阅读更多有关于“C++,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

合肥科大智能常年招聘.NET,Web前端,有想换工作的私聊我AY唯一QQ:875556003和AY交流

抖音号:wpfui,可以看到我的很多作品效果,私活合作请qq联系我

AYUI8社区版Github地址:前往获取

作者:杨洋(AaronYang简称AY,安徽六安人)目前是个人,还没公司AY唯一QQ:875556003和AY交流

高中学历,2015年1月17日开始,兴趣学习研究WPF,目前工作繁忙,不接任何活

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费.AY主要靠卖技术服务挣钱

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

vs2015 企业版密钥HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

vs2017 企业版密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

标签列表