تبدیل آرایه استاتیک به 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
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
...