Câu trả lời trước cho rằng bạn luôn là có chỉ mục đã ký. Đáng buồn thay, std::vector
sử dụng size_type
để lập chỉ mục và difference_type
cho số học của vòng lặp, do đó chúng không hoạt động cùng nhau nếu bạn đã bật "-Wconversion" và bạn bè. Đây là một cách khác để trả lời câu hỏi, trong khi vẫn có thể xử lý cả hai chữ ký và unsigned:
Để loại bỏ:
template<class T, class I, class = typename std::enable_if<std::is_integral<I>::value>::type>
void remove(std::vector<T> &v, I index)
{
const auto &iter = v.cbegin() + gsl::narrow_cast<typename std::vector<T>::difference_type>(index);
v.erase(iter);
}
Chịu:
template<class T, class I, class = typename std::enable_if<std::is_integral<I>::value>::type>
T take(std::vector<T> &v, I index)
{
const auto &iter = v.cbegin() + gsl::narrow_cast<typename std::vector<T>::difference_type>(index);
auto val = *iter;
v.erase(iter);
return val;
}
Nguồn
2016-10-25 15:29:34
Cân nhắc sử dụng std :: deque cung cấp chèn và xóa ở cả hai đầu. – Dario
Không, đừng xem xét sử dụng deque chỉ vì bạn có thể muốn xóa một yếu tố, đó thực sự là lời khuyên nghèo nàn. Có một tải toàn bộ lý do tại sao bạn có thể muốn sử dụng deque hoặc vector. Đúng là việc xóa một phần tử từ một véc tơ có thể tốn kém - đặc biệt nếu véc tơ lớn, nhưng không có lý do gì để nghĩ rằng một deque sẽ tốt hơn một vectơ từ ví dụ mã bạn vừa đăng. – Owl
Ví dụ: nếu bạn có ứng dụng đồ họa nơi bạn hiển thị "danh sách" những thứ bạn chèn/xóa mọi thứ tương tác, hãy xem xét bạn chạy qua danh sách 50-100 lần mỗi giây để hiển thị chúng và bạn thêm/xóa mọi thứ vài lần mỗi phút. Vì vậy, việc thực hiện "danh sách" dưới dạng vectơ có lẽ là một lựa chọn tốt hơn về tổng hiệu quả. –