حذف عناصر از vector توسط index - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

حذف عناصر از vector توسط index

+1 امتیاز

سلام.

من توی یک vector لیست از index هایی که باید حذف بشن را نگهداری می کنیم و یک vector دیگه هم عناصر اصلی ذخیره شدن حالا کد زیر را برای حذف نوشتم هر چقدر فکر می کنم کدم درسته آیا کسی می تونه بگه علت چیه که کد اجرا میشه خطا مواجه میشه؟


int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> a(100);
	for (int i = 0; i < 100; i++)
		a[i] = i;
	int count = 5;
	vector<int> indexs(5);
	for (int i = 99 - count + 1; i <= 99; i++)
		indexs[i - (99 - count + 1)] = i;

	int counter = 0;

	for (int i = 0; i < count; i++)
		a.erase(a.begin() + indexs[i]-i  );
	


	return 0;
}
	

 

سوال شده فروردین 25, 1393  بوسیله ی lavashak (امتیاز 65)   4 8 14
ویرایش شده فروردین 26, 1393 بوسیله ی lavashak

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

ویرایش

 

 اگر index ها بصورت random هستن به این شکل که نوشتین اشتباهه چون مثلا اگر index  داخلش 1 باشه و یک آرایه 10 عضوی داشته باشین اندیسی که می خواین پاک کنین منفی میشه  و هم این که عناصر اشتباه پاک میشن

اگر راندوم هستن شاید بهتر باشه که اصلا از vector استفاده نکنین از list استفاده کنین (برای a )

برای این که کد بالا همیشه درست کار کنه باید index ها sort هم بشن قبلش و تکراری هم داخلشون نداشته باشید که بهترین راه به نظر من برای این کار استفاده از set  به جای vector ایندکس ها هستش  که هر 2تا ویژگی بالا رو داره

#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
#include <random>
using namespace std;
int main()
{
    vector<int> a(100);
    for (int i = 0; i < 100; i++)
        a[i] = i;

    const int count = 5;
    set<int> indexs;
    for (int i = 0; i < count; i++)
        indexs.emplace(rand()%60);

    int j=0;
    for (auto i = indexs.begin(); i != indexs.end(); ++i,j++)
        a.erase(a.begin() + (*i -j) );

}

 

 

پاسخ داده شده فروردین 26, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد فروردین 26, 1393 بوسیله ی lavashak
این مثاله شاخص به صورت تصادفی هستند در ضمن من کد را ویرایش کردم و -i را قرار دادم با این وجود کدم مشکل داره ممنون اگه جواب بدین
...