Hàm Insert trong Vector C++

Chào mọi người!
Em đang code chèn thêm thông tin nhân viên vào danh sách, khi xuất ra kết quả bị sai. Vd trước khi chèn, em nhập thông tin của A B C. Sau đó, em chèn thông tin D vào vị trí thứ 2 thì output ra là ABDD, nhưng kết quả ABDC mới đúng. Cho em hỏi em bị sai lỗi nào ạ? Sao lại thông tin D lại lặp lại cuối mảng ạ?

class NhanVien {
protected:
	string hoten;
	string loai;
public: 
	NhanVien(){

	}
	virtual ~NhanVien() {}
	virtual void Nhap() {
		cout << "\nNhap ho va ten: ";
		cin.ignore();
		getline(cin, hoten);
		cout << "\nNhap loai nhan vien: ";
		getline(cin, loai);
	}

	virtual void Xuat() {
		cout << "\nHo va ten: " << hoten;
		cout << "\nLoai: " << loai;
	}

	friend istream& operator << (istream& is, NhanVien& nv) {
		nv.Nhap();
		return is;
	}

	friend ostream& operator >> (ostream& os, NhanVien& nv) {
		nv.Xuat();
		return os;
	}

	virtual float Luong() {
		return 0;
	}
};

class VanPhong :public NhanVien {
private:
	int hesochucvu;
public:
	void Nhap() {
		NhanVien::Nhap();
		cout << "\nNhap he so chuc vu: "; cin >> hesochucvu;
	}

	void Xuat() {
		NhanVien::Xuat();
		cout << "\nHe so chuc vu: " << hesochucvu;
		cout << "\nLuong hang thang: " << fixed << setprecision(0) << Luong();
		cout << "\n\n";
	}

	float Luong() {
		return 1000000 * hesochucvu;
	}
};

class LapTrinhVien :public NhanVien {
private:
	int sophanmem;
public:
	void Nhap() {
		NhanVien::Nhap();
		cout << "\nNhap so phan mem viet duoc: "; cin >> sophanmem;
	}

	void Xuat() {
		NhanVien::Xuat();
		cout << "\nSo phan mem viet duoc: " << sophanmem;
		cout << "\nLuong hang thang: " << fixed << setprecision(0) << Luong();
		cout << "\n\n";
	}

	float Luong() {
		return 5000000 * sophanmem;
	}
};

class PhucVu :public NhanVien {
private:
	float thuong;
public:
	void Nhap() {
		NhanVien::Nhap();
		cout << "\nNhap tien thuong: "; cin >> thuong;
	}

	void Xuat() {
		NhanVien::Xuat();
		cout << "\nTien thuong: " << thuong;
		cout << "\nLuong hang thang: " << fixed << setprecision(0) << Luong();
		cout << "\n\n";
	}

	float Luong() {
		return 3000000 + thuong;
	}
};

class Menu {
private:
	vector <NhanVien*> NV;
public:
	Menu() {

	}
	~Menu() {

	}

	void Nhap() {
		int n;
		cout << "\nNhap tong so nhan vien: "; cin >> n;
		for (int i = 0; i < n; i++) {
			cout << "\nNhan vien van phong (1), Lap trinh vien (2), Nhan vien phuc vu (3): ";
			int k; cin >> k;
			NhanVien* nv;
			if (k == 1)
				nv = new VanPhong;
			else if(k == 2)
				nv = new LapTrinhVien;
			else
				nv = new PhucVu;
			nv->Nhap();
			NV.push_back(nv);
		}
	}

	void Xuat() {
		for (int i = 0; i < NV.size(); i++)
			NV.at(i)->Xuat();
	}
	void ChenThongTin() {
		int pos;
		cout << "\nNhap vi tri can chen: "; cin >> pos;
		cout << "\nNhan vien van phong (1), Lap trinh vien (2), Nhan vien phuc vu (3): ";
		int k; cin >> k;
		if (k == 1)
			NV[pos] = new VanPhong;
		else if (k == 2)
			NV[pos] = new LapTrinhVien;
		else
			NV[pos] = new PhucVu;
		NV[pos]->Nhap();
			NV.insert(NV.begin() + pos ,NV[pos]);
		cout << "\nThong tin nhan vien duoc them vao: ";
		Menu::Xuat();
	}

Bạn đã tác động vài giá trị của vector trước khi bạn gọi đến insert().

ABC
C = D => ABD
insert(D) => ABDD

Bạn gọi đến NV[pos] = ... tức là bạn đang ghi đè giá trị có sẵn (C) thành giá trị mới (D). Sau đó chèn giá trị mới thêm 1 lần nữa, chẳng phải ra 2 thằng D à!

3 Likes

Vậy phải tạo biến temp thay cho NV[pos] để tạo ra giá trị mới đúng không ạ?

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?