杂碎知识点(三)

本博客内容:
一、给定行数,但是每行读入的值个数不同
二、字符串之间的转换
三、字符串与整型之间的转换
四、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

猜你喜欢

转载自blog.csdn.net/xiongluo0628/article/details/82312870