1.map用法
2.跟使用list方式不一样的地方:
map<int,double> maptest
迭代器定义:map<int,double> :: iterator iter = maptest.begin();
除了前面类型 map<int,double> 跟list不一样,定义的其他跟list一样
2.1 取值方式。
iter->first,iter->second,…,iter->n
通过这种方式来取值。
2.2排序
map会根据key的值自动进行排序。所以放进里面的序列不用考虑排序问题。
2.3添加一项的方式:
因为不用考虑排序问题,所以不用像list那样那么复杂的判断。
思路:使用map的find函数,查询添加进来的deg,
iter = m_Polynomial.find(要查找的内容);
在已有map是否存在:
有存在的deg,将他们的cof相加。
cout<<"该次数存在map中,进行系数合并---"<<"\n";
m_Polynomial[term.deg] = iter->second + term.cof;
没有的话,说明是一个新的deg,进行插入就好。
m_Polynomial.insert(pair<int, double>(term.deg, term.cof));
void CPolynomial::AddOneTerm(Node term)
{
map<int, double>::iterator iter =m_Polynomial.begin();
iter = m_Polynomial.find(term.deg);
if (iter == m_Polynomial.end())
{
m_Polynomial.insert(pair<int, double>(term.deg, term.cof));
}
else
{
cout<<"该次数存在map中,进行系数合并---"<<"\n";
m_Polynomial[term.deg] = iter->second + term.cof;
}
}
Polynomial.h
#include <map>
#include <cmath>
#include <string>
#include <iostream>
#include <fstream>
#include<sstream>
using namespace std;
class CPolynomial
{
private:
struct Node
{
public:
double cof;
int deg;
Node()
{
cof = 0.0;
deg = 0;
}
};
map<int, double> m_Polynomial;
public:
CPolynomial();
virtual ~CPolynomial();
CPolynomial(string file); // initialization using file
CPolynomial(const CPolynomial &other);
void cutcofzero();
void Print();
// overload
CPolynomial operator+(const CPolynomial &right ) const; //Overload operator +
CPolynomial operator-(const CPolynomial &right ) const; //Overload operator -
CPolynomial operator*(const CPolynomial &right ) const; //Overload operator *
CPolynomial& operator=(const CPolynomial &right ); //Overload operator =
private:
void ReadFromFile(string file);
void AddOneTerm(Node term); // add one term into m_Polynomial
};
#include "Polynomial.h"
CPolynomial::CPolynomial(void)
{
}
CPolynomial::~CPolynomial(void)
{
}
CPolynomial::CPolynomial(string file)
{
ReadFromFile(file);
}
void CPolynomial::Print()
{/*
map<int, double>::iterator iter;
for (iter = m_Polynomial.begin(); iter != m_Polynomial.end(); iter++)
{
cout<<"deg= "<<iter->first<<" "<<"cof= "<<iter->second<<"\n";
}*/
map<int, double>::iterator iter;
cout<<"f(x)= ";
for (iter = m_Polynomial.begin(); iter != m_Polynomial.end(); iter++)
{
char sign =NULL;
double tempcof = 0;
if (iter->first < 0)
{
sign = '-';
tempcof = fabs(iter->second);
}
else
{
tempcof = iter->first;
sign = '+';
}
cout<<sign<<tempcof<<"x^"<<iter->second;
}
cout<<"\n";
}
void CPolynomial::ReadFromFile(string file)
{
ifstream in_file; //read from file
in_file.open(file);
string oneLine;
char c;
int number=0;
while (getline(in_file, oneLine))
{
istringstream readfromstr(oneLine); //readfromstr may be known as a temp str
Node node;
if (number==0)
{
readfromstr >> c >> number; //put data to c,number
if (0 == number || c != 'P')
{
cout << "invalid data!" <<endl;
return;
}
}
else
{
readfromstr >> node.deg >> node.cof;
AddOneTerm(node);
number--;
}
}
in_file.close();
}
void CPolynomial::AddOneTerm(Node term)
{
map<int, double>::iterator iter =m_Polynomial.begin();
iter = m_Polynomial.find(term.deg);
if (iter == m_Polynomial.end())
{
m_Polynomial.insert(pair<int, double>(term.deg, term.cof));
}
else
{
cout<<"该次数存在map中,进行系数合并---"<<"\n";
m_Polynomial[term.deg] = iter->second + term.cof;
}
}
CPolynomial::CPolynomial(const CPolynomial &other)
{
Node temp;
map<int, double>::const_iterator itr = other.m_Polynomial.begin();
for(; itr != other.m_Polynomial.end(); itr++)
{
temp.cof = itr->second;
temp.deg = itr->first;
AddOneTerm(temp);
}
}
CPolynomial& CPolynomial::operator=(const CPolynomial &right )
{
Node temp;
map<int, double>::const_iterator itr = right.m_Polynomial.begin ();
for(;itr != right.m_Polynomial.end(); itr++)
{
temp.cof = itr->second;
temp.deg = itr->first;
AddOneTerm (temp);
}
return *this;
}
void CPolynomial::cutcofzero()
{
map<int, double>::iterator iter = m_Polynomial.begin();
for (;iter != m_Polynomial.end(); iter++)
{
if (fabs(iter->second) < 1.0e-10) //if cof=0,remove this term
{
iter = m_Polynomial.erase(iter);
}
}
}
CPolynomial CPolynomial:: operator+(const CPolynomial& right ) const
{
CPolynomial tempResult = right;
Node tempnode;
map<int, double>:: const_iterator iter = m_Polynomial.begin ();
//m_Polynomial is const,so use const_iterator
for (; iter != m_Polynomial.end(); iter++)
{
tempnode.deg = iter->first;
tempnode.cof = iter->second;
tempResult.AddOneTerm(tempnode);
}
tempResult.cutcofzero();
return tempResult;
}
CPolynomial CPolynomial:: operator-(const CPolynomial& right) const
{
CPolynomial tempResult;
Node temp1,temp2;
map<int, double>::const_iterator iter_left = m_Polynomial.begin();
map<int, double>::const_iterator iter_right = right.m_Polynomial.begin();
for (;iter_right != right.m_Polynomial.end();iter_right++)
{
temp1.cof = -(iter_right->second);
temp1.deg = iter_right->first;
tempResult.AddOneTerm(temp1);
}
for (;iter_left != m_Polynomial.end();iter_left++)
{
temp2.cof = iter_left->second;
temp2.deg = iter_left->first;
tempResult.AddOneTerm(temp2);
}
tempResult.cutcofzero();
return tempResult;
}
CPolynomial CPolynomial:: operator*(const CPolynomial& right) const
{
CPolynomial tempResult;
Node temp1;
map<int, double>::const_iterator iter_right = right.m_Polynomial.begin();
map<int, double>::const_iterator iter_left = m_Polynomial.begin ();
for (; iter_left != m_Polynomial.end(); iter_left++)
{
for (; iter_right != right.m_Polynomial.end(); iter_right++)
{
temp1.cof = iter_left->second * iter_right->second;
temp1.deg = iter_left->first + iter_right->first;
tempResult.AddOneTerm(temp1);
}
iter_right = right.m_Polynomial.begin();
}
tempResult.cutcofzero();
return tempResult;
}
main.h
#include "Polynomial.h"
int main()
{
//read file
CPolynomial p1("P1.txt");
CPolynomial p2("P2.txt");
cout<<"P1:"<<"\n";
p1.Print();
cout<<"\n";
cout<<"P2:"<<"\n";
p2.Print();
cout<<"\n";
#if 0
//overload =
CPolynomial p3;
p3=p1;
p3.Print();
cout<<"\n";
// copy Cploynomial
CPolynomial p4=p3;
p4.Print();
cout<<"\n";
// overload +
CPolynomial p5;
p5 = p1 + p2;
cout<<"p1+p2:"<<"\n";
p5.Print();
cout<<"\n";
// overload -
CPolynomial p6;
p6 = p1 - p2;
cout<<"p1-p2:"<<"\n";
p6.Print();
cout<<"\n";
#endif
// overload *
CPolynomial p7;
p7 = p1 * p2;
cout<<"p1*p2:"<<"\n";
p7.Print();
return 0;
}