Vector的使用
本文以MFC程序读取txt文件中的字符串为例,介绍4种Vector的使用方法
一、单个1维Vector向量的使用(向量的类型为变量)
在.h中的定义如下
void getMultistr(CString Sstr, vector<CString>& Multistr);
在.cpp中的函数如下
void CReadCStringDlg::OnBnClickedButtonReadCstring()
{
CStdioFile InputFile;
CString InputFilter;
CString InputFilePath;
CString str;
vector<CString> Mstr;
// 1、读取样本数据
InputFilter = _T("Data Files(*.txt)|*.txt||");
CFileDialog MyDialog(TRUE, 0, 0, OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY, InputFilter);
if (IDOK == MyDialog.DoModal())
{
// 打开文件,逐行读取数据
InputFilePath = MyDialog.GetPathName();
InputFile.Open(InputFilePath, CFile::modeReadWrite);
InputFile.ReadString(str);
getMultistr(str, Mstr);
Mstr.erase(Mstr.begin(), Mstr.end()); //删除所有元素
// Mstr.pop_back();//删除最后一个元素
// vector<CString>::iterator k = Mstr.begin();
// Mstr.erase(k); //删除第1个元素
InputFile.ReadString(str);
getMultistr(str, Mstr);
InputFile.Close();
}
}
void CReadCStringDlg::getMultistr(CString Sstr, vector<CString>& Multistr)
{
CString temp;
int pos;
int length;
while (1)
{
pos = Sstr.Find(_T(" "));
if (-1 != pos)
{
length = Sstr.GetLength();
temp = Sstr.Left(pos);
Multistr.push_back(temp);
Sstr = Sstr.Right(length - pos - 1);
}
else
{
Multistr.push_back(Sstr);
return;
}
}
}
注意:向量的形参是通过地址接收的。地址接收的意义在于形参上的向量发生改变之后,实参上的向量也会对应的发生改变。若不加&符号,形参上的向量数据发生改变之后,实参上的数据不会发生变化。
二、1维Vector向量数组的使用(向量的类型为变量)
在.h中的定义
void getMultistr(CString Sstr, vector<CString>& Multistr);
在.cpp的函数如下
void CReadCStringDlg::OnBnClickedButtonReadCstring()
{
CStdioFile InputFile;
CString InputFilter;
CString InputFilePath;
CString str;
vector<CString>* Mstr;
// 1、读取样本数据
InputFilter = _T("Data Files(*.txt)|*.txt||");
CFileDialog MyDialog(TRUE, 0, 0, OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY, InputFilter);
if (IDOK == MyDialog.DoModal())
{
// 打开文件,逐行读取数据
InputFilePath = MyDialog.GetPathName();
InputFile.Open(InputFilePath, CFile::modeReadWrite);
Mstr = new vector<CString>[2]; //定义向量数组的大小
InputFile.ReadString(str);
getMultistr(str, Mstr[0]);
// Mstr.erase(Mstr.begin(), Mstr.end()); //删除所有元素
// Mstr.pop_back();//删除最后一个元素
// vector<CString>::iterator k = Mstr.begin();
// Mstr.erase(k); //删除第1个元素
InputFile.ReadString(str);
getMultistr(str, Mstr[1]);
InputFile.Close();
}
}
void CReadCStringDlg::getMultistr(CString Sstr, vector<CString>& Multistr)
{
CString temp;
int pos;
int length;
while (1)
{
pos = Sstr.Find(_T(" "));
if (-1 != pos)
{
length = Sstr.GetLength();
temp = Sstr.Left(pos);
Multistr.push_back(temp);
Sstr = Sstr.Right(length - pos - 1);
}
else
{
Multistr.push_back(Sstr);
return;
}
}
}
注意:向量的形参是通过地址接收的。地址接收的意义在于形参上的向量发生改变之后,实参上的向量也会对应的发生改变。若不加&符号,形参上的向量数据发生改变之后,实参上的数据不会发生变化。
三、单个1维Vector向量的使用(向量类型为指针)
在.h中的定义如下
void getMultistr(CString Sstr, vector<CString*>& Multistr);
在.cpp中的函数如下
void CReadCStringDlg::OnBnClickedButtonReadCstring()
{
CStdioFile InputFile;
CString InputFilter;
CString InputFilePath;
CString str;
vector<CString*> Mstr;
// 1、读取样本数据
InputFilter = _T("Data Files(*.txt)|*.txt||");
CFileDialog MyDialog(TRUE, 0, 0, OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY, InputFilter);
if (IDOK == MyDialog.DoModal())
{
// 打开文件,逐行读取数据
InputFilePath = MyDialog.GetPathName();
InputFile.Open(InputFilePath, CFile::modeReadWrite);
InputFile.ReadString(str);
getMultistr(str, Mstr);
// Mstr.erase(Mstr.begin(), Mstr.end()); //删除所有元素
// Mstr.pop_back();//删除最后一个元素
// vector<CString>::iterator k = Mstr.begin();
// Mstr.erase(k); //删除第1个元素
InputFile.ReadString(str);
getMultistr(str, Mstr);
InputFile.Close();
}
}
void CReadCStringDlg::getMultistr(CString Sstr, vector<CString*>& Multistr)
{
CString temp;
int pos;
int length;
while (1)
{
pos = Sstr.Find(_T(" "));
if (-1 != pos)
{
length = Sstr.GetLength();
temp = Sstr.Left(pos);
Multistr.push_back(new CString(temp));
Sstr = Sstr.Right(length - pos - 1);
}
else
{
Multistr.push_back(new CString(Sstr));
return;
}
}
}
注意:
1.向量的形参是通过地址接收的。地址接收的意义在于形参上的向量发生改变之后,实参上的向量也会对应的发生改变。若不加&符号,形参上的向量数据发生改变之后,实参上的数据不会发生变化。
2. 因为形参向量 Multistr是通过指针传递进来的,故在使用时Multistr.push_back(new CString(Sstr));需要进行分配内存。
四、1维Vector向量数组的使用(向量的类型为指针)
在.h中的定义如下
void getMultistr(CString Sstr, vector<CString*>& Multistr);
在.cpp中的函数如下
void CReadCStringDlg::OnBnClickedButtonReadCstring()
{
CStdioFile InputFile;
CString InputFilter;
CString InputFilePath;
CString str;
vector<CString*>* Mstr;
// 1、读取样本数据
InputFilter = _T("Data Files(*.txt)|*.txt||");
CFileDialog MyDialog(TRUE, 0, 0, OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY, InputFilter);
if (IDOK == MyDialog.DoModal())
{
// 打开文件,逐行读取数据
InputFilePath = MyDialog.GetPathName();
InputFile.Open(InputFilePath, CFile::modeReadWrite);
Mstr = new vector<CString*>[2];
InputFile.ReadString(str);
getMultistr(str, Mstr[0]);
// Mstr.erase(Mstr.begin(), Mstr.end()); //删除所有元素
// Mstr.pop_back();//删除最后一个元素
// vector<CString>::iterator k = Mstr.begin();
// Mstr.erase(k); //删除第1个元素
InputFile.ReadString(str);
getMultistr(str, Mstr[1]);
InputFile.Close();
}
}
void CReadCStringDlg::getMultistr(CString Sstr, vector<CString*>& Multistr)
{
CString temp;
int pos;
int length;
while (1)
{
pos = Sstr.Find(_T(" "));
if (-1 != pos)
{
length = Sstr.GetLength();
temp = Sstr.Left(pos);
Multistr.push_back(new CString(temp));
Sstr = Sstr.Right(length - pos - 1);
}
else
{
Multistr.push_back(new CString(Sstr));
return;
}
}
}
注意:
1.向量的形参是通过地址接收的。地址接收的意义在于形参上的向量发生改变之后,实参上的向量也会对应的发生改变。若不加&符号,形参上的向量数据发生改变之后,实参上的数据不会发生变化。
2. 因为形参向量 Multistr是通过指针传递进来的,故在使用时Multistr.push_back(new CString(Sstr));需要进行分配内存。