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

وبـــلاگ هــفت خــط کــد


آموزش های برنامه نویسی
۴۴۲ نفر آنلاین
۲۴۳ عضو و ۱۹۹ مهمان در سایت حاضرند

کارکرد دقیق وکتور

+1 امتیاز

سلام

من این کد رو متوجه نمیشم اگه میشه توضیح بدین:

vector < vector <string> > A(row , vector <string> (column));

این کد یک وکتور دوبعدی ساخته که تعداد سطر ها رو row و تعداد ستون ها رو column مشخص میکنه؟

چرا پارامتر دوم A باید حتما وکتور باشه؟

یعنی اگه به این صورت بنویسیم :

 vector < vector < vector <string>> > A();

باید ۳تا پارامتر به A بدیم چون وکتور ۳ بعدیه؟؟

و اینکه نحوه قرار گیری وکتور در حافظه رو  به صورت دقیق توضیح بدین
و مقاله یا سایتی که به صورت کامل و جامع وکتور رو اموزش بده معرفی کنین
مرسی

 

سوال شده اردیبهشت 11, 1393  بوسیله ی moh3en (امتیاز 209)   15 28 40

1 پاسخ

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

کلاس vector یک سازنده داره به این شکل :

explicit vector (size_type n, const value_type& val = value_type(),
                 const allocator_type& alloc = allocator_type());
  • ورودی اول تعداد اعضای vector زمان ساخته شذن رو تعیین می کنه
  • ورودی دوم  مقدار اولیه هر کدوم از اعضای ساخته شدست
  • ورودی سوم هم allocator وکتور هست که مشخص می کنه وکتور به چه شکل  حافظه بگیره
  • ورودی دوم و سوم اختیاری هستن

 

داخل کد شما  از همین سازنده استفاده شده :

vector < vector <string> > A(row , vector <string> (column));

 

پارامتر row تعداد اعضای اولیه است یعنی باعث میشه ما یک vector با سایز row داشته باشیم .

ورودی دوم هم به هر کدوم از خونه های وکتور که ساخته میشه یک vector<string> با سایز column نسبت میده

چیزی که در اصل این vector هست اینه که ما یک وکتور یک بعدی داریم با row تا خونه که داخل هر کدوم از عضو هاش یک vector<string با column تا خونه قرار گرفتن که محتواشون هم یک String خالی هستش

مثلا اگر row ,col به ترتیب 2و3 باشن : 

 

vector, c++, حافطه وکتور, آموزش

 

که میشه وکتور بالا رو به شکل یک ماتریس 2 بعدی row*column هم در نظر گرفت که این دیگه به نحوه فکر کردن خودتون مربوط میشه

برای 3 بعدی هم به همین شکل برای اندازه اولیه دادن میتونین این شکلی عمل کنین :

    vector < vector < vector <string> > > a(5,vector<vector<string>>(3,vector<string>(2)));

کد بالا هم به همین شکل کار می کنه و  یک آرایه 5*3*2 میسازه

یا به عبارتی یک آرایه یک بعدی داریم که داخل هر خونش یک vector<vector<string میزاریم .

در ضمن لزومی هم نداره شما زمان ساختن vector از این سازنده استفاده کنین .برای زیاد کردن سایز از ریسایز هم میشه استفاده کرد .

 

در مورد نحوه قرار گیری در حافظه وکتور کاملا مثل آرایست فضای حافظه ای که میگیره بصورت یک بلاک پیوسته از حافظست .

یک وکتور ساده میتونه به این شکل باشه پیاده سازیش :

#include <iostream>

template<class T>
class MyVector
{
public:
    MyVector():
        size(0),
        array(nullptr)
    {}
    void push(const T& item)
    {
        T* newArray=new T[size+1];
        for(int i=0;i<size;i++)
        {
            newArray[i]=array[i];
        }
        newArray[size++]=item;
        delete[] array;
        array=newArray;
    }

    ~MyVector()
    {
        delete[] array;
    }

    //other stuffs
private:
    T* array;
    int size;
};

int main()
{
    MyVector<int> a;
    a.push(23);
}

داخل متد push همون طوری که مشخصه یک آرایه با سایز بزگتر میسازیم و محتوای قبلی رو داخلش کپی می کنیم

هیچ چیز جادویی در مورد vector وجود نداره یک کلاسه که با template نوشته شده و از همین اصول ساده هم استفاده می کنه .

البته vector سی پلاس پلاس برای گرفتن حافظه از new استفاده نمی کنه از یک Allocator خاص استفاده می کنه  که توضیحش رو میتونید توی لینک زیر ببینید :

http://www.codeproject.com/Articles/4795/C-Standard-Allocator-An-Introduction-and-Implement

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