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

سلام یه سوالی درباره ی کلاس وکتور در سی پلاس پلاس داشتم؟

+1 امتیاز
می خواستم بدونم که چه طور با کلاس وکتور می شه داده ای رو ذخیره کرد و میانگین و ماکسیمم و مینیمم اون رو تعیین کرد؟
سوال شده خرداد 21, 1399  بوسیله ی yz (امتیاز 64)   4 7

2 پاسخ

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

سلام؛ استفاده از کتابخانه‌های STL بسیار سر راست و آسان هست.

 

STL Container:  std::vector

مثلاً برای استفاده از std::vector می‌تونید به این‌صورت عمل کنید:

std::vector<int> vec;
vec.push_back(10);
vec.push_back(11);
vec.push_back(12);
vec.push_back(13);

با استفاده از تابع std::vector::push_back به انتهای آرایه‌اتون یک مقدار اضافه می‌کنید، با استفاده از تابع std::vector::size هم می‌تونید تعداد داده‌ای که توی std::vectorتون ذخیره شده رو به دست بیارید :

for(size_t i = 0; i < vec.size(); ++i)
{
    std::clog << vec.at(i) << std::endl;
    std::clog << vec[i] << std::endl;
}

که خروجی میشه :

10
10
11
11
12
12
13
13

تنها تفاوتی که تابع std::vector::at با عملگر [ ]  داره، اینکه تابع std::vector::at یک عملیات Range checking هم انجام میده، به این معنی‌که اگه روی شئ std::vector بالا این تابع را با ورودی ۱۰ استفاده کنیم یک Exception دریافت می‌کنیم :

terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check: __n (which is 10) >= this->size() (which is 4)

که به وضوح مشخص می‌کنه ورودی شما ۱۰ هست، درحالی که کل اندازه ۴ هست. 

 

کتابخانه‌های STL از Iteratorها هم استفاده می‌کنند، که شما می‌تونید به این‌صورت روی عناصرشون Iterate کنید :

for(auto i : vec)
{
    std::clog << i << std::endl;
}

به این نوع حلقه Range for می‌گند که نیازمند پیاده‌سازی توابع begin, end برای اون کلاستون هست.

 

 

STL Algorithms : std::generate, std::minmax_element

همچنین، ما در STL کلاس‌هایی تحت عنوان Algortithms در هدرفایلی به همین اسم داریم. که توی نوشتن کد سریع و بدون مشکل خیلی به ما کمک می‌کنه. مثلاً برای اینکه بخوایم یک Containerی مثل std::vector رو مقداردهی کنیم. می‌تونیم به راحتی از std::generate استفاده کنیم که یک begin iterator و end به یک شئ و یک Callable object دریافت می‌کنه و به ازاء هر عنصر از کلاس ما مقدار بازگشتی از Callable objectت‌مون رو بهش ارسال می‌کنه :

 

std::vector<int> vec(10);

std::srand(std::time(nullptr));
std::generate(vec.begin(), vec.end(), []() { return std::rand() % 1000; });

و مثلاً برای پیدا کردن بزرگ‌ترین و کوچک‌ترین عضو، می‌تونیم از std::minmax_element استفاده کنیم، که نیازمند یک کامپایلر با پشتیبانی از استاندارد ۱۷ هست. این تابع یک begin iterator و end به کلاس Container شما دریافت می‌کنه و یک std::pair بر می‌گردونه :

auto [min, max]{std::minmax_element(vec.begin(), vec.end())};
std::clog << *min << ":" << *max << std::endl;
پاسخ داده شده خرداد 21, 1399 بوسیله ی mg_ramezani (امتیاز 727)   1 1 12
انتخاب شد خرداد 22, 1399 بوسیله ی yz
+2 امتیاز
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main()
{
  std::vector<int> save = { 7, 1, 2, 3, 4 };
    std::ofstream fileWrite("File.dat", std::ios::binary | std::ios::trunc);
    fileWrite.write((char*)save.data(), save.size() * sizeof(int));
    fileWrite.close();

    std::ifstream fileRead("File.dat", std::ios::binary);
    std::vector<int> load;
    int temp;
    while(fileRead.read((char*)&temp, sizeof(int)))
        load.push_back(temp);
    fileRead.close();

   std::vector<int> items;
   auto sum_value = std::accumulate(items.begin(),items.end(),0);
   mean_value = sum_value / (int)items.size();
   auto min_max = minmax_element(items.begin(),items.end());
    cout << "mean:"<<  mean_value  << endl;
    cout << "min :"<<  min_max .first << endl;
    cout << "max :"<<  min_max .second<< endl;



    for(int i = 0; i < load.size(); i++) 
        std::cout <<  load[i] << std::endl;

    return 0;
}

 

پاسخ داده شده خرداد 21, 1399 بوسیله ی AliStar (امتیاز 164)   2 20 32
...