Tôi có một stl::vector<int>
và tôi cần xóa tất cả các phần tử tại các chỉ mục đã cho (vector thường có chiều cao cao). Tôi muốn biết, đó là cách hiệu quả nhất để thực hiện một hoạt động như vậy trong tâm trí rằng thứ tự của vector gốc cần được bảo toàn.Xóa các phần tử trong stl :: vector bằng cách sử dụng các chỉ mục
Mặc dù, tôi đã tìm thấy bài đăng có liên quan về vấn đề này, một số trong số họ cần xóa một số single element hoặc multiple elements trong đó remove-erase idiom dường như là một giải pháp tốt. Trong trường hợp của tôi, tuy nhiên, tôi cần xóa nhiều phần tử và vì tôi đang sử dụng chỉ mục thay vì giá trị trực tiếp, bạn không thể áp dụng remove-erase idiom
, phải không? Mã của tôi được đưa ra dưới đây và tôi muốn biết nếu nó có thể làm tốt hơn về hiệu quả?
bool find_element(const vector<int> & vMyVect, int nElem){
return (std::find(vMyVect.begin(), vMyVect.end(), nElem)!=vMyVect.end()) ? true : false;
}
void remove_elements(){
srand (time(NULL));
int nSize = 20;
std::vector<int> vMyValues;
for(int i = 0; i < nSize; ++i){
vMyValues.push_back(i);
}
int nRandIdx;
std::vector<int> vMyIndexes;
for(int i = 0; i < 6; ++i){
nRandIdx = rand() % nSize;
vMyIndexes.push_back(nRandIdx);
}
std::vector<int> vMyResult;
for(int i=0; i < (int)vMyValues.size(); i++){
if(!find_element(vMyIndexes,i)){
vMyResult.push_back(vMyValues[i]);
}
}
}
Vấn đề là, rằng các chỉ số sẽ không có giá trị nữa sau khi phần tử đầu tiên bị xóa, cùng với các trình vòng lặp (bạn có thể lấy một trình lặp từ một chỉ mục có 'vec.begin() + index'). – Xeo
@Georg, mã thực hiện những gì cần. Ý tưởng là xóa 'phần tử' ở vị trí' đã cho'. Trong mã của tôi, một 'phần tử' được đại diện bởi' vMyValues' và 'vị trí' bởi' vMyIndexes'. – Peter
Tôi nghĩ rằng tôi đã có điểm mù giống như Andy trong khi đọc ... mã hiện tại của bạn không loại bỏ tại chỗ để vấn đề không có;) –