时间:2020年06月08日 | 作者 : aaronyang | 分类 : C++ | 浏览: 1200次 | 评论 0 人
C++导入命名空间用using
然后我在vs2019中,下面写法报错
会报错,建议还是使用上面第一种的写法
或者
这种写法(偏第一种)
标准库类型string
#include <string>
一个string好多东东
注意输入:“ Hello world ”
string对象会自动忽略开头的空白(空格符,换行符,制表符),从第一个字符读取,到下一个空白结束
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; } }
size()长度
结果乱码
换成这样就行了
cout <<"你输入了"<< line.size() <<"个字:"<<line << endl;
当然这样也行
我猜应该是size()是int类型的,跟string不能一起
string::size_type类型就是size()返回的。
现在C++11 ,你可以使用auto或者decltype
auto len=line.size(); 无符号
特别注意:
这样写会报错的,
这样写是对的
必须确保每个加法运算符(+)的两侧的运算的对象至少有一个是string
其他string的方法
char a2 = toupper('a');
cout << a2 << endl;
所以字符串,转换,只能一个一个字符串转
使用for(类型 对象名:字符串){}
接下来,我们把字符串 变成大写
统计标点
decltype(s.size()) psum = 0;
for (auto d:s)
{
if (ispunct(d)) {
psum++;
}
}
cout << "一共" << psum << "个标点符号" << endl;
结果字符串包括中文标点符号,就报错了。
百度: 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;
其他
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;
#include <vector>
C++类模板,函数模板,vector是个类模板
(目前我也不太懂)
编译器根据模板创建类或者函数的过程叫 实例化
当使用模板时候,需要指出编译器应把类或函数实例化为何种类型
以前的C++标准,vector<vector<string> > 注意最后两个>中间有个空格
(有点像C#的泛型集合List<T>)
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; }
继续增加判断
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;
迭代器运算
*iter 返回 当前元素
iter-> mem mem是一个属性,例如C#类中的 student.Name属性 这里iter就是 foreach的item,mem就是Name属性。等价于(*iter).mem,这里也可以直接方法 iter -> empty()
++iter,就是下一个元素
--iter上一个元素
iter1==iter2两个迭代器是否相等
iter1!=iter2两个迭代器是否不相等
这里知识和C#的泛型和foreach有点像
迭代器和常量迭代器,常量只能读元素
看begin()返回
如果对象只需读操作无写,最好使用常量类型,
C++11 提供了,cbegin,cend();
迭代器的运算 ,你自己理解为 int的加减吧,就是移动位置,到第几个元素
比如中间位置
auto mid=v1.begin()+v1.size()/2;
测试了 非整数
vector<int> values{ 10,20,30,40,50,60,70,80,90 };
这里4.5就是取整数4
C++的方括号,在变量名后面
int aaa[10]
下面,sz是 10个整型指针
不能用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;//错误的
复杂的数组声明
这样不会错哦
这个报错
就是这个值必须是常量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;
发现个奇怪的,
ptr[0]是3200,ptr[1]是3
所以可以这么理解,ptr就是一个位置记录, 0就是当前指向的对象,然后1,就是下一个,以此类推
加减运算
获得不存在的尾元素遍历,这里p2[10] 这个元素不存在的
int* endp2 = &p2[10]; for (int* begin=p2; begin!=endp2; begin++) { cout << *begin << endl; }
当然也提供了begin ,end
指针加减一个值,还是指针,
长度就是相减。
指针直接-2,,等于3
这是下标运算,vector也支持。
AYUI www.ayjs.net AY 杨洋原创编写,请不要转载谢谢
推荐您阅读更多有关于“C++,”的文章
抖音:wpfui 工作wpf,目前主maui
招聘合肥一枚WPF工程师,跟我一个开发组,10-15K,欢迎打扰
目前在合肥市企迈科技就职
AYUI8全源码 Github地址:前往获取
杨洋(AaronYang简称AY,安徽六安人)和AY交流
高中学历,2010年开始web开发,2015年1月17日开始学习WPF
声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费
不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo
查看捐赠AYUI7.X MVC教程 更新如下:
第一课 第二课 程序加密教程
额 本文暂时没人评论 来添加一个吧
发表评论