本博客内容:
一、给定行数,但是每行读入的值个数不同
二、字符串之间的转换
三、字符串与整型之间的转换
四、C++读取文件相关操作
五、iterator类的使用
六、判断元素是否存在于vector中,去重复、2个vector求交集,并集
七、原码、反码、补码
#一、给定行数,但是每行读入的值个数不同
参考:https://zhidao.baidu.com/question/878840778803576692.html
代码段1:从控制台读入不同行的数据,每行个数不同
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
using namespace std;
int main()
{
vector<vector<int> > matrix;
vector<int>data;
string line;
int n;
while(cin>>n)
{
cin.ignore(); //处理第一个行读入数字最后的那个转行符
for(int i=0;i<n;i++)
{
data.clear();
getline(cin,line);
istringstream sin(line);
int j=0,num;
while(sin>>num)
{
data.push_back(num);
j++;//记录每行的个数
}
matrix.push_back(data);
}
//下面是打印矩阵操作
for(int iter1=0;iter1<matrix.size();++iter1)
{
for(int iter2=0;iter2<matrix[iter1].size();++iter2)
cout<<matrix[iter1][iter2]<<" ";
cout<<endl;
}
}
return 0;
}
代码段2:从文件中读入(每行数据个数不同)
#include<iostream>
#include<vector>
#include<string>
#include<fstream>
#include<sstream>
using namespace std;
int main()
{
vector<vector<int> > matrix;
vector<int>data;
string line;
ifstream fin("in.txt");// in.txt存放着多行数据,每行个数不同
if(fin)
{
while(!fin.eof())
{
data.clear();
getline(fin,line);
istringstream sin(line);
int i=0,num;
while(sin>>num)
{
data.push_back(num);
i++;
}
matrix.push_back(data);
cout<<"该行公有"<<i<<"个数"<<endl;
}
}
return 0;
}
#二、字符串之间的转换:
###char * char[]数组 string之间的转换
#include<sstream> //用于包含stringstream
#include<stdlib.h> //用于包含atoi函数
#include<stdio.h> //y用于包含sprintf函数
转换1:char* 转化为char [ ]数组
void f(char* input)
{
int length=strlen(input)+1;
char *temp=new char[length];
int i=0;
while(*input!='\0') //使用input[i]也可以
{ temp[i]=*input; input++;i++;}
temp[i]='\0'; //结尾必须加结束字符
}
转换2:char* 转化为string:直接赋值
转换3:char[] 转化为char *:直接赋值
转换4:char[] 转化为string:直接赋值
转换5:string 转化为char *:
1.调用string.c_str() 返回的是const char*,转换使用char* 或者 const_cast<char*>去除
2.string.data() 返回的也是const char *
3.string.copy(数组名t,拷贝几个,从第几个开始); *(t+5)='\0';
转换6:string 转化为char []:
同上,需要循环赋值
#三、字符串与整型之间的转换
1.string/char*转int
/
void stringToInt1(string test)
{
int i;
sscanf(test.c_str(),"%D",&i);
cout<<i<<endl;
}
/
void stringToInt2(string test)
{
stringstream ss;
ss<<test;
int i; ss>>i;
cout<<i<<endl;
}
/
void stringToInt3(string test)
{
int t=atoi(test.c_str()); 一个参数即可
}
2.int转换为string/char*
/
void intTostring1(int test)
{
//char * itoa(int value,char* string,int radix) ; radix十进制数
char ch[10];
itoa(test, ch,10);
string reslut=ch;
cout<<ch<<endl;
}
//
void intTostring2(int test)
{
sprintf(char* buffer,const char* format,[argument...]) buffer写入的字符串
char temp[10];
int length=sprintf(temp,"%05d",test); //返回值是字符串的长度
cout<<temp;
}
/
void intTostring3(int test)
{
stringstream ss;
ss<<test;
string s1=ss.str();
cout<<s1<<endl;
//或者
string s2;
ss>>s2;
}
#四、C++读取文件相关操作
参考:https://www.cnblogs.com/liaocheng/p/4371796.html
fstream提供三种类,实现C++对文件的操作
ofstream :写操作
ifstream :读操作
fstream :读写操作 由iostream引入
读写操作需要包括头文件fstream
一、写
ofstream OpenFile("file.txt"); //无则创建
if(OpenFile.fail())
exit(0);
OpenFile<<"abc def hig";//将abc def hig写入文件
OpenFile.close();
二、读
ifstream OpenFile("file.txt");
判断一下是否读入失败
Openfile>>str;
cout<<str<<endl; 打印结果是只有abc (因为见空格就停止了)
三、改用getline一次可以读取一行
OpenFile.getline(str,20); //仅仅能读一行了才
cout<<str<<endl;
OpenFile.close();
//如果想一次读写一个字符:使用get() 和put()函数
#五、iterator类的使用
#include <iostream>
#include <vector>
#include<iterator>
using namespace std;
int main()
{
vector<int>vec;
for(int i=0;i<5;i++)
vec.push_back(i);
cout<<"the original array is"<<endl;
vector<int>::iterator beg=vec.begin();
for(int i=0;i<5;i++)
cout<<vec[i]<<endl;
beg+=2;
insert_iterator<vector<int> > i_itr(vec,beg); //参数分别是容器和待插入的位置
*i_itr++=10;
*i_itr++=20;
cout<<"array after "<<endl;
beg=vec.begin();
while(beg!=vec.end())
cout<<*beg++<<endl;
return 0;
}
//运行结果:本来是1 2 3 4 5 插入后是: 1 2 10 20 3 4 5
C++ STL中拷贝函数的使用: copy(b.begin(),b.end(),a.end());
//将b中的元素复制到a的指定迭代器位置。
#六、判断元素是否存在于vector中,去重复、2个vector求交集,并集
#include<iostream>
#include<vector>
#include<algorithm> //sort
#include<iterator> //iterator
//函数1 :
方法1:去重
copy(a.begin(),a.end(),b.begin());将a拷贝到b的开头部分
vector<int> unique_element_in_vector<vector<int>& v)
{
vector<int>::iterator vector_iterator;
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
}
//方法2:直接插入到set中,本身就是有序而且去重的,再copy到vector中
//函数2: :求交集 求并集 使用库函数
vector<int> vectors_intersection(vector<int> v1,vector<int> v2)
{
vector<int> v;
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end());
set_intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),back_insert(v));//求交集
set_union(v1.begin(),v1.end(),v2.begin(),v2.end(),back_insert(v));//求并集
//函数3: 是否存在
vector<int>::iterator it;
it=find(v.begin(),v.end(),element);
if(it!=v.end())
return true;
#七、计算机中的原码、反码、补码
参考:https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
了解一些概念:
机器数:一个数在计算机中的二进制表示方式,叫做机器数。
真值:机器数的形式值就不等于真正的数值。
① 原码、反码、补码的计算
1.正数的三者都相同
2.负数:比如 -1
原码 1000 0001
反码: 1111 1110 将原码除了符号位的其他位进行反转
补码: 反码+1 1111 1111