Dùng vector::emplace_back thay cho vector::push_back

Hi mọi người.
Tình hình là mình cần tạo 1 vector với kiểu dữ liệu là 1 struct cho trước.
Ví dụ struct là 1 phiên họp với thời điểm bắt đầu, thời điểm kết thúc và thời gian của phiên họp.

struct info {
    int start, end, val;
};

sau đó mình tạo 1 vector với kiểu dữ liệu trên:
vector<info> arr(n);
rồi tiến hành nhập dữ liệu:

for (int i = 0; i < n; ++i) {
    cin >> x >> y;
    arr.push_back({x, y, y - x});
}

hoặc

for (int i = 0; i < n; ++i) {
    cin >> x >> y;
    arr.emplace_back(x, y, y - x);
}

Nhưng khi nhập xong mình xuất ra kết quả nhập thử thì toàn số 0: https://ideone.com/Z8sN8e

#include <iostream>
#include <vector>
using namespace std;
 
struct info {
	int st, en, val;	
};
 
int main() {
	int n, x, y;
	cin >> n;
	vector<info> arr(n);
	for (int i = 0; i < n; ++i) {
		cin >> x >> y;
		arr.push_back({x, y, y - x});
	}
	for (int i = 0; i < n; ++i) cout << arr[i].st << " " << arr[i].en << " " << arr[i].val << endl;
	return 0;
}

Nếu mình ko dùng push_back mà dùng emplace_back như trên thì bị lỗi. (mình ko rành về cách sử dụng emplace_back lắm!).
Ai biết về lỗi này xin hướng dẫn giúp mình cách sửa với ạ! Mình search trên SO thì họ cũng push_back như trên!
Mình cảm ơn trước.

chú tạo 1 thằng info và gán giá trị cho nó trước, sau đó push nó vào vector là đc! đẩy kiểu {} nó biết đg nào mà lần @@!

1 Like

Ngoài cách tạo riêng 1 biến info gán giá trị rồi push vào thì còn cách nào khác không ạ?
(vì đối với std::pair mình thấy dùng {} khởi tạo giá trị và push trực tiếp được vào vector)

Vậy mình phải sửa như thế nào với TH trên ạ? (ngoài tạo riêng biến kiểu info rồi gán giá trị xong push vào)

còn cách bạn không sử dụng struct mà sử dụng class trong oop, có hàm dựng của class, vector.push(new class());

1 Like

Mình ko dùng {} để khởi tạo giá trị cho struct được hả bạn?
Nó vẫn ra toàn 0: https://ideone.com/uUhFOw
Trong khi mình tra trên SO họ khởi tạo bằng {} được: https://stackoverflow.com/questions/5289597/how-to-use-vectorpush-back-with-a-struct

nó hướng dẫn đó, muốn viết vậy thì bạn viết thêm 1 cái hàm trả về 1 thằng info. rồi truyền thẳng vào push của vector! Ngoài ra mình nghỉ chẳng còn cách nào khác!

arr(n) là đã khai báo mảng n phần tử rồi, push back thêm n phần tử nữa thì nó thành mảng 2n phần tử, in n phần tử đầu tiên thì nó toàn 0 đúng rồi…

Khai báo arr đủ rồi.

arr.push_back({x, y, y - x}); là kiểu khai báo nào? :V :V :V :V

5 Likes

Chắc em bị nhầm với kiểu khởi tạo của pair {a, b} rồi ạ :((

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