تبدیل آرایه استاتیک به vector - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تبدیل آرایه استاتیک به vector

+2 امتیاز
سلام به دوستان گلم.

چطور باید یک آرایه استاتیک را به یک vector تبدیل کرد؟(البته بدون کپی کردن)
سوال شده دی 3, 1393  بوسیله ی Xavi (امتیاز 627)   24 83 110

3 پاسخ

–1 امتیاز

آقا جون با راههای زیادی میشه این کاررو انجام داد کاش سلوشن دقیقو میگفتین اما من یه موردشو میگم

#include <iostream>
#include <iterator>
#include <vector>

using namespace std;

int main()
{
    int arr_s[]={1,2,3,4,8,9,10};
    vector<int> arr_v(begin(arr_s),end(arr_v));
    
    cout << arr_v.at(5) << endl << arr_v.size() << endl;
    cout << endl;
    for(auto a : v){
        cout << a << endl;
    }
    return 0;
}

 

این یه راه سادش هست اما برای اینکار باید از استاندارد سی پلاس 11 به بالا استفاده کرد

پاسخ داده شده دی 4, 1393 بوسیله ی Fire360Boy (امتیاز 2,524)   6 24 43
ویرایش شده دی 8, 1393 بوسیله ی Fire360Boy
وقتی که آرایه رو روی stack میسازید (یعنی new نکرده باشید ) delete کردن undefine behavior و اشتباه هستش (البته حتی اگر new هم کرده بودید باز هم undefine بود چون باید delete[] می کردید نه delete )
آهاندش میتونم بپرسم دقیقاً این جک رو کی گفته؟
اولاً شما لطف کن قبل کامنت گذاشتن یکم مطالعه کن ببین چی به چیه
مورد اول : شما اگه delete کنی میاد توی heap میگرده میبینه آبجکت Referenceیی که توی استک بوده هست یا نه و میبینه که نیست بعدش هیچ اتفاق خاصی نمیفته
مورد دوم : هیچ فرقی اینجا نداره چه از delete استفاده کنی چه از delete []
http://www.cplusplus.com/reference/new/operator%20delete/

اگه قبول نداری بگو تا برات با مثال عملی اثبات کنم
حالا من نمیدونم شما با توجه به کدوم رفرنس میگین اشتباه هست در ضمن موقع کامپایل فقط یه ورن میده میگه که این کار به طور پیش فرض انجام میشه
سلام همه برو بچه ها . راس میگه استفاده از عملگر delete تو این کد درست نیست.
در مورد فرق delete و []delete هم قبلا جابجا ازش استفاده کرده بودم و نتیجش هم crash شدن برنامه بود . الان نمیدونم هنوز هم همونطوریه یا اینکه تغییر کردن ؟
ولی قبلا []delete و delete با هم فرق داشتن...
چه خبر حاجی ما سرمون شلوغ بود شما غیبت کردی
اخه من امتحان کردم هیچ اتفاقی نیفتاد چند جا هم خونده بودم دقیقا نوشته بود delete یا delete[]
حالا شاید قدیما فرق میکرده یا الان در مواقع خاص فرق میکنه اما بعید میدونم چون توی رفرنس ها هم نگاه کردم چیزی ذکر نشده بود
البته اینجا استفاده کردنش منطقی نبود و من اشتباه کردم
سلامتی سید ! :) فقط مغزم نمیکشه دیگه کد بنویسم :|
من فکر میکنم وقتی با []new حافظه ایجاد بشه قبل از آدرس شروع اشاره گری که به ما برگردونده میشه یه سری اطلاعات درباره اینکه مثلا چندتا شی توی این آرایه وجود دارن ذخیره میشه تا موقع []delete کردن به همون تعداد شی ها رو برداره و Destructor هارو صدا بزنه.
قبلاها رفته بودم تو نخ این موضوع ولی الان یجورایی یادم رفته.
سلام علی جان خوبی ؟
"آهاندش میتونم بپرسم دقیقاً این جک رو کی گفته؟
اولاً شما لطف کن قبل کامنت گذاشتن یکم مطالعه کن ببین چی به چیه "
این مطلب به قدری واضح هست که نیازی به refrence  نداره ! تقریبا هر کتاب ++C و refrence  ای در این مورد مطلب داره (منابع زیر c++11 به بعد هستند و delete , delete[] چیزی هم نیست که مربوط به قدیم باشه و الان عوض شده باشه! )
http://www.parashift.com/c%2B%2B-faq-lite/delete-array-built-ins.html
http://msdn.microsoft.com/en-us/library/h6227113
از این جا http://en.cppreference.com/w/cpp/language/delete
3 خط اول !
For the first (non-array) form, expression must be a pointer or a class type contextually implicitly convertible to a pointer, and its value must be either null or pointer to a" non-array object created by a new-expression," or a pointer to a base subobject of a non-array object created by a new-expression (if it's "anything else, the behavior is" undefined).
کتاب c++ programming language نوشته شده توسط سازنده ++C
http://www.7khatcode.com/?qa=blob&qa_blobid=12791566318351179496
گوگل ! :
https://www.google.com/?gws_rd=ssl#q=using+delete+instead+of+delete%5B%5D
https://www.google.com/?gws_rd=ssl#q=using+delete+on+variable+on+stack
"شما اگه delete کنی میاد توی heap میگرده میبینه آبجکت Referenceیی که توی استک بوده هست یا نه"
داخل delete اصلا گشتن ای انجام نمیشه پوینتر و سایزش مشخصه توابع سیستم عامل مربوطه صدا زده میشه و heap آزاد میشه! ضمنا آرایه refrence توی stack نیست یک بلاک هستش کاملا با refrence متفاوته .

بعد این که undefine behavior یعنی این که ممکنه امتحان کنی داخل اون شرایط خاص درست جواب بده قرار نیست اگر متغیر روی stack  باشه یا بجای delete ازdelete[] استفاده بشه  همیشه برنامه کرش بشه .
سلام داش امید مرسی.
به نظرم این بحث رو ادامه ندید بهتر باشه چون به کل کل تبدیل میشه که اونطوری خوب نیست.
با توجه به احترامی که برای شما قائل هستم اما باید بگم که


Delete
**********************************************
Frame address : 0028FF20
--------------------------------------------------------------------------------
5      {
0x00401340    push   %ebp
0x00401341    mov    %esp,%ebp
0x00401343    and    $0xfffffff0,%esp
0x00401346    sub    $0x20,%esp
0x00401349    call   0x417c70 <__main>
6       int *a=new int[10];
0x0040134E    movl   $0x28,(%esp)
0x00401355    call   0x4013d0 <operator new[](unsigned int)>
0x0040135A    mov    %eax,0x1c(%esp)
7       delete  a;
0x0040135E    mov    0x1c(%esp),%eax
0x00401362    mov    %eax,(%esp)
0x00401365    call   0x401460 <operator delete(void*)>
8       return 0;
0x0040136A    mov    $0x0,%eax
9     }
0x0040136F    leave
0x00401370    ret
/////////////////////////////////////////////////////////////////////
Frame function: operator delete(void*)
Frame address : 0028FEF0
--------------------------------------------------------------------------------
0x00401460    mov    0x4(%esp),%eax
0x00401464    test   %eax,%eax
0x00401466    je     0x401470 <operator delete(void*)+16>
0x00401468    jmp    0x4216f0 <free>
0x0040146D    lea    0x0(%esi),%esi
0x00401470    repz ret
0x00401472    nop
0x00401473    nop
0x00401474    nop
0x00401475    nop
0x00401476    nop
0x00401477    nop
0x00401478    nop
0x00401479    nop
0x0040147A    nop
0x0040147B    nop
0x0040147C    nop
0x0040147D    nop
0x0040147E    nop
0x0040147F    nop
0x00401460    mov    0x4(%esp),%eax
0x00401464    test   %eax,%eax
0x00401466    je     0x401470 <operator delete(void*)+16>
0x00401468    jmp    0x4216f0 <free>
0x0040146D    lea    0x0(%esi),%esi
0x00401470    repz ret
0x00401472    nop
0x00401473    nop
0x00401474    nop
0x00401475    nop
0x00401476    nop
0x00401477    nop
0x00401478    nop
0x00401479    nop
0x0040147A    nop
0x0040147B    nop
0x0040147C    nop
0x0040147D    nop
0x0040147E    nop
0x0040147F    nop
Delete []
**************************************************************
Frame address : 0028FF20
--------------------------------------------------------------------------------
5      {
0x00401340    push   %ebp
0x00401341    mov    %esp,%ebp
0x00401343    and    $0xfffffff0,%esp
0x00401346    sub    $0x20,%esp
0x00401349    call   0x417c80 <__main>
6       int *a=new int[10];
0x0040134E    movl   $0x28,(%esp)
0x00401355    call   0x4013e0 <operator new[](unsigned int)>
0x0040135A    mov    %eax,0x1c(%esp)
7       delete []  a;
0x0040135E    cmpl   $0x0,0x1c(%esp)
0x00401363    je     0x401371 <main()+49>
0x00401365    mov    0x1c(%esp),%eax
0x00401369    mov    %eax,(%esp)
0x0040136C    call   0x401470 <operator delete[](void*)>
8       return 0;
0x00401371    mov    $0x0,%eax
9     }
0x00401376    leave
0x00401377    ret
/////////////////////////////////////////////////////////////////////////////////
Frame function: operator delete[](void*)
Frame address : 0028FEF0
--------------------------------------------------------------------------------
0x00401470    jmp    0x402fd0 <operator delete(void*)>
0x00401475    nop
0x00401476    nop
0x00401477    nop
0x00401478    nop
0x00401479    nop
0x0040147A    nop
0x0040147B    nop
0x0040147C    nop
0x0040147D    nop
0x0040147E    nop
0x0040147F    nop
0x00401470    jmp    0x402fd0 <operator delete(void*)>
0x00401475    nop
0x00401476    nop
0x00401477    nop
0x00401478    nop
0x00401479    nop
0x0040147A    nop
0x0040147B    nop
0x0040147C    nop
0x0040147D    nop
0x0040147E    nop
0x0040147F    nop
///////////////////////////////////////////////////////////////////////////
Frame function: operator delete(void*)
Frame address : 0028FEF0
--------------------------------------------------------------------------------
0x00402FD0    mov    0x4(%esp),%eax
0x00402FD4    test   %eax,%eax
0x00402FD6    je     0x402fe0 <operator delete(void*)+16>
0x00402FD8    jmp    0x421710 <free>
0x00402FDD    lea    0x0(%esi),%esi
0x00402FE0    repz ret
0x00402FE2    nop
0x00402FE3    nop
0x00402FE4    nop
0x00402FE5    nop
0x00402FE6    nop
0x00402FE7    nop
0x00402FE8    nop
0x00402FE9    nop
0x00402FEA    nop
0x00402FEB    nop
0x00402FEC    nop
0x00402FED    nop
0x00402FEE    nop
0x00402FEF    nop
0x00402FD0    mov    0x4(%esp),%eax
0x00402FD4    test   %eax,%eax
0x00402FD6    je     0x402fe0 <operator delete(void*)+16>
0x00402FD8    jmp    0x421710 <free>
0x00402FDD    lea    0x0(%esi),%esi
0x00402FE0    repz ret
0x00402FE2    nop
0x00402FE3    nop
0x00402FE4    nop
0x00402FE5    nop
0x00402FE6    nop
0x00402FE7    nop
0x00402FE8    nop
0x00402FE9    nop
0x00402FEA    nop
0x00402FEB    nop
0x00402FEC    nop
0x00402FED    nop
0x00402FEE    nop
0x00402FEF    nop
خب این چیزایی که گذاشتی چیو ثابت می کنه ؟ مگه من جایی گفتم که "حتما" قراره delete بجای delete[] روی آرایه اشتباه کار کنه ؟ شما هر وقت فهمیدی undefine behavior یعنی چی بیا با هم بحث می کنیم . (حالا باز خوبه آخر کامنت قبل هم نوشتم undefine behaviour ِیعنی چی !)
اون کامنت آخر هم چون توهین کرده بودی پاک کردم .
چه توهینی
یادم نمیاد چی بوده ولی مطمئیناً
اصلا قصد توهین نبوده
ویرایش میکردی خوب
حواست باشه بچه های شیراز باهوش تره این حرف ها هستن :) نباید باهاشون کل کل کنی!!!!

قبول کن بابا همون توی DELETE[] هم داره delete صدا زده میشه
اون کدارو که از خودم نزاشتم کپیش کن یه جا نگاش کن از توی msvcrt درآوردم!!!
آهان پس بگو چرا این قدر 2 تا [] مهمه  
بخاطر شیرازی بودنه آدم خسته میشه 2 تا [] اضافه بنویسه :))))
من نمی خواستم کل کل کنم کلا گفتم کامپایلر هایی هستن که []delete رو به اون شکل بر حسب delete پیاده سازی نمی کنن که در اون صورت یا برنامه کرش می کنه یا memory leak داریم
عجب!!!!
پاکش کردم D:
کامنتارو هم تغییر دادم
این بحث به جایی نمیرسه :)
–1 امتیاز

البته اینجوریم بدون 11 میشه استفاده کرد

با توجه به overload سوم vector که در آدرس زیر هست میشه

http://www.cplusplus.com/reference/vector/vector/vector/

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int arr_s[]={1,2,3,4,8,9,10};
    vector<int> arr_v(arr_s,arr_s+ sizeof(arr_s)/sizeof(arr_s[2]));
    
    cout << "size : " << arr_v.size() << endl;
    for(int i=0 ; i<arr_v.size(); i++){
        cout << arr_v[i] << endl;
    }
    cout << arr_s[2];
    return 0;
}

 

البته باید توجه داشت که اینجوری کل آرایه هارو میریزه مثلا اگه یه آرایه 100 تایی داشته باشیم و فقط چهارتای اولش اینیشیالایز شده باشه این کد هر صدتا عنصررو تبدیل به وکتور میکنه توی کد قبلی هم همین کاررو میکنه

پاسخ داده شده دی 4, 1393 بوسیله ی Fire360Boy (امتیاز 2,524)   6 24 43
ویرایش شده دی 8, 1393 بوسیله ی Fire360Boy
+3 امتیاز

بدون کپی کردن راهی وجود نداره (چون هر کاری هم که انجام بدیم چون فضای حافظه وکتور داخل heap هست و آرایه روی stack حتما یک بار باید کپی انجام بشه .)

برای ساخت وکتور از روی آرایه 2 تا کار میشه انجام داد :

int arr[3] = {1, 2, 3};
std::vector<int> vec(std::begin(arr), std::end(arr));

//ya
std::vector<int> vec(sizeof(arr)/sizeof(arr[0]));
std::copy(std::begin(arr), std::end(arr)),vec.begin());

 

پاسخ داده شده دی 6, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
...