30/09/2018, 16:27

Vector Trong C++

Chào mọi người .
Em là Học
Hôm nay em xin trình bày vấn đề em gặp phải trong lúc code mà sửa hoài không ra .
Đây là code của em.

#include <iostream>
#include <vector>
#include <conio.h>
using namespace std;
 
void capphat(vector<vector<int>> &a , int sodong  ,int socot)
{
	a.resize(sodong);
	for( int i =  0 ; i < a.size() ; i++)
	{
		a[i].resize(socot);
	}
}
void nhap(vector<vector<int>> &a)
{
	for( int i = 0 ; i < a.size() ; i++)
	{
		for( int j = 0 ; j < a[i].size(); j++)
		{
			cout << "A["<<i<<"]["<<j<<"]= ";
			cin >> a[i][j];
		}
	}
}
void xuat(vector<vector<int>> a)
{
	for( int i = 0 ; i < a.size(); i++)
	{
		for( int j = 0 ; j < a[i].size() ; j++)
			cout << a[i][j] << "	 ";
		cout << endl;
	}
}
void HuyBo(vector<vector<int>> a)
{
	for(int i = 0 ; i < a.size() ; i++)
	{
		a[i].clear();
	}
	a.clear();
}
bool MAX(int a,int b)
{
	return a > b;
}
bool MIN(int a,int b)
{
	return a < b;
}
int Timkiem(vector<vector<int>> a , bool (*p)(int ,int )  )
{
	int sosanh = a[0][0];
	for(int i = 0 ; i < a.size(); i++)
	{
		for( int j = 0 ; j < a[i].size(); j++ )
		{
			if( p(sosanh,a[i][j]) )
				sosanh = a[i][j];
		}
	}
	return sosanh;
}
void XoaDong(vector<vector<int>> &a, int vitridongcanxoa)
{
		for( int i = vitridongcanxoa ; i < a.size() - 1 ; i++)
		{
			for( int j = 0 ; j < a[i].size(); j++)
			{
				a[i][j] = a[i+1][j];
			}
		}
		a[vitridongcanxoa + 1].clear(); 
		a.resize(a.size() - 1);
}
void XoaCot(vector<vector<int>> &a, int vitricotcanxoa)
{
	for( int i = vitricotcanxoa ; i < a[i].size() - 1 ; i++)
	{
		for( int j = 0 ; j < a.size(); j++)
		{
			
			a[j][i] = a[j][i+1];
		}
	}
	for( int i =  0 ; i < a.size() ; i++)
	{
		a[i].resize(a[i].size() - 1);
	}
}
void main()
{
	vector<vector<int>> a;
	int sodong,socot;
	cout << "Nhap So Dong: ";
	cin >> sodong;
	cout << "Nhap So Cot : ";
	cin >> socot;
	capphat(a,sodong,socot);
	nhap(a);
	xuat(a);
	cout << "
GiaTri Lon Nhat Trong Mang La: " << Timkiem(a,MIN);
	cout << "
GiaTri Nho Nhat Trong Mang La: " << Timkiem(a,MAX);
	cout << "
Xoa Dong ";
	int xoadong;
	cout << "Nhap Vi Tri Dong Muon Xoa: ";
	cin >> xoadong;
	XoaDong(a,xoadong);
	xuat(a);
	cout <<"a";
	cout << "
Xoa Cot ";
	int xoacot;
	cout << "Nhap Vi Tri Cot Muon Xoa: ";
	cin >> xoacot;
	XoaCot(a,xoacot);
	xuat(a);
	cout <<"a";
	HuyBo(a);
	getch();
}

code Khá Dài nên mọi người thông cảm .
em gặp vấn để ở 2 hàm sau đây .

void XoaDong(vector<vector<int>> &a, int vitridongcanxoa)
{
		for( int i = vitridongcanxoa ; i < a.size() - 1 ; i++)
		{
			for( int j = 0 ; j < a[i].size(); j++)
			{
				a[i][j] = a[i+1][j];
			}
		}
		a[vitridongcanxoa + 1].clear(); 
		a.resize(a.size() - 1);
}
void XoaCot(vector<vector<int>> &a, int vitricotcanxoa)
{
	for( int i = vitricotcanxoa ; i < a[i].size() - 1 ; i++)
	{
		for( int j = 0 ; j < a.size(); j++)
		{
			
			a[j][i] = a[j][i+1];
		}
	}
	for( int i =  0 ; i < a.size() ; i++)
	{
		a[i].resize(a[i].size() - 1);
	}
}

Khi em chỉ gọi 1 hàm thì nó lại làm đúng.
nhưng khi em gọi và thực hiện 2 hàm trên cùng 1 lúc thì nó đột nhiên trong lúc chạy nó báo lỗi ( theo em thì lỗi đó là Suy suất bộ nhớ sai ) .Mọi người có thể chạy thử code ở trên

  • Em nghĩ là em sai ở chỗ lúc mà em cập nhật lại bộ nhớ nhưng sửa hoài ko ra .
    Mong mọi người giúp em
    Em xin cảm ơn mọi người đã xem topic này của em.
Gió viết 18:40 ngày 30/09/2018

Hàm xoaDong ban chuyển các dòng sau dịch lên rồi sau đó lại clear dongcanxoa+1 là không đúng. Bạn đã chuyển các dòng sau lên thì bây giờ dòng cuối không còn mang ý nghĩa. Bạn nên xoá dòng này mới đúng. Cụ thể:

Lỗi truy xuất bộ nhớ là do dòng dongcanxoa+1 có 0 phần tử. Do đã bị clear

Sửa lại:

… Đoạn code dịch lên 1 ô…

a.rbegin()->clear(); //xoá dòng cuối.
a.resize(a.size()-1); 

đoạn này cũng tương tự như xoá cột.


tốt hơn bạn nên dùng hàm erase có sẵn:

void xoaDong( ...a,int dong){
    a[dong].clear();
    a.erase(a.begin()+dong);
}
Bài liên quan
0