আমি কীভাবে কোনও ভেক্টরে সর্বাধিক (বা নূন্যতম) মান পেতে পারি?


123

সি ++ তে আমি কীভাবে কোনও ভেক্টরে সর্বাধিক (বা নূন্যতম) মান পেতে পারি ?

আমি গুগলে এর জন্য কয়েকটি সমাধান দেখেছি তবে সেগুলির কোনওোটাই আমার কাছে বোঝায় না :(

কেউ কোনও সহজ সরল পদ্ধতিতে ব্যাখ্যা করতে পারেন কীভাবে কোনও ভেক্টর থেকে সর্বাধিক বা ন্যূনতম মূল্য পাবেন? এবং আমি কী ধরে নিচ্ছি যে এটি অ্যারের সাথে কমবেশি একই রকম হবে?

আমি ঠিক একটি পুনরাবৃত্তি প্রয়োজন? আমি এটি দিয়ে চেষ্টা করেছি max_elementকিন্তু ত্রুটি পেয়েছি ?

vector<int>::const_iterator it;
it = max_element(cloud.begin(), cloud.end());

ত্রুটি: সদস্যের জন্য অনুরোধ 'ক্লাউড' এ 'শুরু', যা শ্রেণিবদ্ধ প্রকারের 'ইন্ট [10]' এর

সম্পাদনা: আমি নিজের উত্তর দিতে পারিনি ??? সুতরাং আমি এটি এখানে রাখব ...

বাহ, দ্রুত উত্তরগুলির জন্য ধন্যবাদ! আমি এইভাবে এটি শেষ করেছি, মনে হয় ঠিক আছে?

for (unsigned int i = 0; i < cdf.size(); i++)
  if (cdf[i] < cdfMin)
    cdfMin = cdf[i];

কোথায় cdfভেক্টর


দেখে মনে হচ্ছে cloudএটি কোনও এসটিএল ধারক নয়, বরং একটি int[10]। মূলত, cloudএকটি সদস্য নেই .begin()। আপনি কেবল এই একটি কাজ না করে না হলে একটি বেসিক সি ++ বই পেতে পারে।
ক্রিস এ।

আরও কিছু কোডও কার্যকর হতে পারে। মেঘের সংজ্ঞা কোথায়?
টিম

9
@ ব্লব্লোব: এবং তবুও আপনি পোস্ট করেছেন এমন সংকলক ত্রুটি বলেছে যে "মেঘটি অ-শ্রেণীর ধরণের int[10]"। তখন কীভাবে এটি ভেক্টর হতে পারে?
jalf

উত্তর:


118

সি ++ 11 / সি ++ 0x কম্পাইল পতাকা ব্যবহার করে, আপনি পারেন

auto it = max_element(std::begin(cloud), std::end(cloud)); // c++11

অন্যথায়, আপনার নিজের লিখুন:

template <typename T, size_t N> const T* mybegin(const T (&a)[N]) { return a; }    
template <typename T, size_t N> const T* myend  (const T (&a)[N]) { return a+N; }

এটি http://ideone.com/aDkhW এ লাইভ দেখুন :

#include <iostream>
#include <algorithm>

template <typename T, size_t N> const T* mybegin(const T (&a)[N]) { return a; }    
template <typename T, size_t N> const T* myend  (const T (&a)[N]) { return a+N; }

int main()
{
    const int cloud[] = { 1,2,3,4,-7,999,5,6 };

    std::cout << *std::max_element(mybegin(cloud), myend(cloud)) << '\n';
    std::cout << *std::min_element(mybegin(cloud), myend(cloud)) << '\n';
}

ওহ, এবং আপনার উভয় একবারে প্রয়োজন হলে ব্যবহার করুনstd::minmax_element(...) : /


হাই, আপনি কি জানেন যে এটি মাত্রা অ্যারে বা ভেক্টরটিতে প্রয়োগ করা সম্ভব?
চার্লস চৌ চৌ

3
হ্যা, তুমি পারো. স্ট্যান্ডার্ড লাইব্রেরী অ্যালগরিদমগুলি পুনরাবৃত্তকারীদের জন্য সাধারণভাবে কাজ করার জন্য ডিজাইন করা হয়েছে। পয়েন্টারগুলিও পুনরাবৃত্ত হয়।

85

আপনি যদি ফাংশনটি ব্যবহার করতে চান তবে আপনাকে std::max_element()যেভাবে করতে হবে তা হ'ল:

double max = *max_element(vector.begin(), vector.end());
cout<<"Max value: "<<max<<endl;

আমি আশা করি এটি সাহায্য করতে পারে।


10
কেন নেই **max_element?
কনরাড

39
এটি কারণ ´max_element´retre একজন পুনরুক্তিকারী
অ্যাঞ্জি কুইজানো

আমার ধারণা আপনি ইনপুটটিকে ভেক্টর <ডাবল> হিসাবে ধরে নিয়েছেন বা ডিফল্ট রিটার্ন ডাবল ভ্যালু দ্বারা * সর্বোচ্চ_সংশ্লিষ্ট () করেন।
সমীর কেপে

14

দিন,

 #include <vector>

 vector<int> v {1, 2, 3, -1, -2, -3};

ভেক্টরটি যদি আরোহী বা অবতরণ ক্রমে বাছাই করা থাকে তবে আপনি এটি জটিলতা ও (1) সহ সন্ধান করতে পারেন।

আরোহী ক্রমের একটি ভেক্টরের জন্য প্রথম উপাদানটি ক্ষুদ্রতম উপাদান, আপনি এটি ভি [0] (0 ভিত্তিক সূচক) দ্বারা পেতে পারেন এবং শেষ উপাদানটি সবচেয়ে বড় উপাদান, আপনি এটি ভি [আকারঅফেক্টর -১] দ্বারা পেতে পারেন।

যদি ভেক্টরটিকে অবতরণ অনুসারে বাছাই করা হয় তবে সর্বশেষ উপাদানটি ক্ষুদ্রতম উপাদান, আপনি এটি ভি [আকারঅফেক্টর -১] দ্বারা পেতে পারেন এবং প্রথম উপাদানটি সবচেয়ে বড় উপাদান, আপনি এটি ভি [0] দ্বারা পেতে পারেন।

যদি ভেক্টরটি বাছাই না করা হয় তবে আপনাকে সবচেয়ে ছোট / বৃহত্তম উপাদান পেতে ভেক্টরটির উপরে পুনরাবৃত্তি করতে হবে this এই ক্ষেত্রে সময় জটিলতা হ'ল (এন), এখানে এন ভেক্টরের আকার।

int smallest_element = v[0]; //let, first element is the smallest one
int largest_element = v[0]; //also let, first element is the biggest one
for(int i = 1; i < v.size(); i++)  //start iterating from the second element
{
    if(v[i] < smallest_element)
    {
       smallest_element = v[i];
    }
    if(v[i] > largest_element)
    {
       largest_element = v[i];
    }
}

আপনি পুনরাবৃত্তকারী ব্যবহার করতে পারেন,

for (vector<int>:: iterator it = v.begin(); it != v.end(); it++)
{
    if(*it < smallest_element) //used *it (with asterisk), because it's an iterator
    {
      smallest_element = *it;
    }
    if(*it > largest_element)
    {
      largest_element = *it;
    }
}

আপনি এটি ইনপুট বিভাগে গণনা করতে পারেন (যখন আপনাকে কোনও প্রদত্ত ভেক্টর থেকে সবচেয়ে ছোট বা বৃহত্তম উপাদানটি সন্ধান করতে হবে)

int smallest_element, largest_element, value;
vector <int> v;
int n;//n is the number of elements to enter
cin >> n;
for(int i = 0;i<n;i++)
{
    cin>>value;
    if(i==0)
    {
        smallest_element= value; //smallest_element=v[0];
        largest_element= value; //also, largest_element = v[0]
    }

    if(value<smallest_element and i>0)
    {
        smallest_element = value;
    }

    if(value>largest_element and i>0)
    {
        largest_element = value;
    }
    v.push_back(value);
}

এছাড়াও আপনি কার্যগুলিতে অন্তর্নির্মিত দ্বারা ক্ষুদ্রতম / বৃহত্তম উপাদানটি পেতে পারেন

#include<algorithm>

int smallest_element = *min_element(v.begin(),v.end());

int largest_element  = *max_element(v.begin(),v.end());

আপনি এই ফাংশনগুলি ব্যবহার করে যে কোনও রেঞ্জের ক্ষুদ্রতম / বৃহত্তম উপাদান পেতে পারেন। যেমন,

vector<int> v {1,2,3,-1,-2,-3};

cout << *min_element(v.begin(), v.begin() + 3); //this will print 1,smallest element of first three elements

cout << *max_element(v.begin(), v.begin() + 3); //largest element of first three elements

cout << *min_element(v.begin() + 2, v.begin() + 5); // -2, smallest element between third and fifth element (inclusive)

cout << *max_element(v.begin() + 2, v.begin()+5); //largest element between third and first element (inclusive)

আমি মিনি_ এলিমেন্ট () / ম্যাক্সিমেন্ট () ফাংশনগুলির আগে, অ্যাসিরিস্টক (*) ব্যবহার করেছি। কারণ দু'জনই পুনরাবৃত্তির প্রত্যাবর্তন করে। সমস্ত কোড সি ++ এ রয়েছে।


2
min_elementএবং max_elementএকটি পুনরাবৃত্তি ফিরিয়ে দিন , পয়েন্টার নয় not যাইহোক, প্রযুক্তিগতভাবে পয়েন্টার সংশোধন করা একটি পুনরাবৃত্তির একটি উপসেট। দেখুন: stackoverflow.com/questions/2728190/...
rayryeng

আমি আমার উত্তর আপডেট করেছি। আপনার পর্যবেক্ষণ জন্য আপনাকে ধন্যবাদ।
তাওহিদুল ইসলাম

9

ধরে নেওয়া মেঘ int cloud[10]আপনি এটি এর মতো করতে পারেন: int *p = max_element(cloud, cloud + 10);


এটিও চেষ্টা করে যাবে আমি আগে আগে ম্যাক্সিমেন্ট পাওয়ার চেষ্টা করেছি কিন্তু ভালোবাসা নেই। ধন্যবাদ!
বব ব্লব

7

আপনি এটিকে সরাসরি ম্যাক্স_এলমেন্ট / মিনি_ইলেমেন্ট ফাংশন ব্যবহার করে মুদ্রণ করতে পারেন। উদাহরণ:

  cout<<*max_element(v.begin(),v.end());

  cout<<*min_element(v.begin(),v.end());

5

সি ++ 11 এ আপনি এর মতো কিছু ফাংশন ব্যবহার করতে পারেন:

int maxAt(std::vector<int>& vector_name) {
    int max = INT_MIN;
    for (auto val : vector_name) {
         if (max < val) max = val;
    }
    return max;
}

আপনি যেহেতু সি ++ 11 উল্লেখ করছেন, এটি ব্যবহার করার চেয়ে এটি কি ভাল std::max_element...?
রাইরিং

1

যদি আপনি একটি পুনরুক্তি ব্যবহার করতে চান তবে আপনি একটি অ্যারের সাথে একটি প্লেসমেন্ট-নতুন করতে পারেন ।

std::array<int, 10> icloud = new (cloud) std::array<int,10>;

()শেষে একটি অভাব নোট করুন , এটি গুরুত্বপূর্ণ। এটি এমন একটি অ্যারে শ্রেণি তৈরি করে যা সেই স্মৃতিটিকে তার স্টোরেজ হিসাবে ব্যবহার করে এবং এতে পুনরাবৃত্তির মতো এসটিএল বৈশিষ্ট্য রয়েছে।

(এটি উপায়ে সি ++ টিআর 1 / সি ++ 11)


1

ভেক্টরের সর্বাধিক মান পেতে আপনি সর্বোচ্চ_সংশ্লিষ্ট ব্যবহার করতে পারেন। সর্বাধিক_সংশ্লিষ্ট একটি পরিসীমাটিকে সবচেয়ে বড় মানের সীমাতে ফেরত দেয় বা সীমাটি ফাঁকা থাকলে শেষ হয়। যেমন একটি পুনরাবৃত্তি পয়েন্টারগুলির মতো (বা আপনি বলতে পারেন যে পয়েন্টারটি পুনরাবৃত্তির একটি রূপ), আপনি মানটি পাওয়ার জন্য এটির আগে * ব্যবহার করতে পারেন। সুতরাং সমস্যা অনুসারে আপনি কোনও ভেক্টরে সর্বাধিক উপাদানটি পেতে পারেন:

int max=*max_element(cloud.begin(), cloud.end());

এটি আপনাকে আপনার ভেক্টর "মেঘ" এ সর্বাধিক উপাদান দেবে। আশা করি এটা সাহায্য করবে.


0

শুধু এটা:

// assuming "cloud" is:
// int cloud[10]; 
// or any other fixed size

#define countof(x) (sizeof(x)/sizeof((x)[0]))

int* pMax = std::max_element(cloud, cloud + countof(cloud));

ম্যাক্রোগুলি কেন ব্যবহার করবেন? এর কোন কারণ নেই! ত্রুটিটি শুরু হয় int cloud[10];এবং এটি যাদু সংখ্যার ব্যবহার।
উলিরিচ এখার্ট্ট

1
কারণ ত্রুটি বার্তা থেকে এটি স্পষ্ট যে তাঁর ভেক্টর নয় তবে সাধারণ অ্যারে রয়েছে। এবং হার্ডকডযুক্ত যাদু সংখ্যাগুলি এড়াতে আপনাকে কোনওভাবে তার দৈর্ঘ্য গণনা করতে হবে। তিনি ভবিষ্যতে দৈর্ঘ্য পরিবর্তন করতে পারেন, তবে এইভাবে সর্বাধিক সন্ধানের কোড একই হবে।
ivan.ukr

দুঃখিত, এটি সঠিকভাবে আসে নি। আপনার সমাধানটি সঠিক তবে খারাপ। কারণটি হ'ল এটি যাদু সংখ্যার ব্যবহার অনুমান করে যা ত্রুটি বার্তাটি অনুসরণ করে না। এরপরে এটি ম্যাক্রোগুলির ব্যবহার নিয়ে চালিয়ে যায়, যা সর্বদা একটি কোডের গন্ধ।
উলিরিচ এ্যাকার্ড্ট 21

-5
#include <stdlib.h>
#include <stdio.h>

int main()
{

    int vector[500];

    vector[0] = 100;
    vector[1] = 2;
    vector[2] = 1239;
    vector[3] = 5;
    vector[4] = 10;
    vector[5] = 1;
    vector[6] = 123;
    vector[7] = 1000;
    vector[8] = 9;
    vector[9] = 123;
    vector[10] = 10;

    int i = 0;

    int winner = vector[0];

    for(i=0;i < 10; i++)
    {
        printf("vector = %d \n", vector[i]);

        if(winner > vector[i])
        {
            printf("winner was %d \n", winner);
            winner = vector[i];
            printf("but now is %d \n", winner);
        }
    }

    printf("the minimu is %d", winner);
}

সম্পূর্ণ ধীরে ধীরে ... সি তে


3
এটি কোনও সিvector
অ্যান্ড্রু স্টাবস

এই প্রশ্নটিকে সি ++ ট্যাগ করা হয়েছে। আপনি এই কোডটি সি তে লিখেছেন তবে কেবল তা নয়, আপনি কোনও ভেক্টরকে একটি অ্যারে হিসাবে সমান করছেন - সঠিক নয়। যখন আমাদের কেবল আসল মান দরকার হয় তখন আপনার কাছে অপ্রয়োজনীয় মুদ্রণ বিবৃতিও থাকে। অবশেষে, পুরো কোডটি বিভ্রান্ত করছে। আপনার কেবল forলুপটিতে কোড দরকার । সামগ্রিকভাবে, খুব খারাপ উত্তর
rayryeng
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.