কী হিসাবে কোনও ভেক্টর সি ++ এ অভ্যন্তরীণভাবে কাজ করে?


14

এই SO উত্তরে বলা হয়েছে যে কী ভেক্টরের জন্য ভেক্টর সহ এসটিএল মানচিত্রটি কী হিসাবে ব্যবহার করা যেতে পারে। সুতরাং যখন আমরা একটি ভেক্টর একটি কী হিসাবে ব্যবহার করি। কীটি কীভাবে অনন্য হওয়া দরকার তাই কীভাবে কাজ করতে হয় তাই যখন আমরা একই উপাদানগুলির সাথে অন্য ভেক্টরটি সন্নিবেশ করবো তখন mapউপাদান দ্বারা ভল্টারের সদৃশ উপাদান বা ভেক্টরের নাম দ্বারা কোনও নির্দিষ্টকরণ করা হবে? অ্যারের নামটি যেমন বেস ঠিকানাটি উপস্থাপন করে। সুতরাং একটি অ্যারে কী হিসাবে ব্যবহার করা যেতে পারে যেহেতু এই ক্ষেত্রে বেস ঠিকানাটি কী হিসাবে ব্যবহার করা যেতে পারে তবে কোনও ভেক্টরের ক্ষেত্রে কী কী। এটি অভ্যন্তরীণভাবে কীভাবে কাজ করে।

কারণ আমি যখন ভেক্টরের নাম মুদ্রণ করি তখন আমি ত্রুটি পাই

vector<int> v;
cout<<v; //error

ভেক্টরের নাম মুদ্রণ করে আপনি কী বোঝাতে চাইছেন?
বার্ট

has operators == and <কিভাবে এটি সাহায্য করে? আমার প্রশ্নটি ছিল নকল উপাদানগুলি ভেক্টর কী উপাদানগুলির সাথে উপাদানটির সাথে তুলনা করার মানচিত্র তৈরি করবে
পুলকিত ভাটনগর

3
@ পুলকিতভাটনগর কিন্তু ... কেউ আপনাকে কখনই এর std::vectorকী হিসাবে ব্যবহার করতে বাধ্য করবে না std::mapআপনি যা ব্যবহার করেন তার জন্য অর্থ প্রদান করুন । এটি করা যেতে পারে এবং এর জন্য কিছু ব্যবহারের ক্ষেত্রেও থাকতে পারে তবে আপনি অবশ্যই আপনার পছন্দসই ডেটা কাঠামো পরিবর্তন করতে পারেন। এসটিএল পাত্রে সর্বাধিক বহুমুখী এবং ব্যবহারযোগ্য যে কোনও উপায়ে ব্যবহারকারীর পক্ষে এটি ব্যবহার করতে পারে এমনভাবে নকশাকৃত।
ইয়্যাকিসারভিনেন


1
সরাসরি পুলকিতভাটনগর স্টোর। std::mapকী এবং মান উভয়ই নিজের মধ্যে অনুলিপি করবে। std::unordered_mapকী এর হ্যাশ সংরক্ষণ করতে পারেন।
ইয়্যাকিসারভিনেন

উত্তর:


9

ক্লাস টেম্পলেট স্ট্যান্ড :: ভেক্টরের জন্য একটি ওভারলোডেড অপারেটর রয়েছে।

template <class T, 
class Allocator>
bool operator< (const vector<T, Allocator>& x, const vector<T, Allocator>& y);

এটি স্ট্যান্ডার্ড অ্যালগরিদমের উপর ভিত্তি করে std::lexicographical_compare

এখানে একটি বিক্ষোভমূলক প্রোগ্রাম।

#include <iostream>
#include <iomanip>
#include <vector>
#include <iterator>
#include <algorithm>

int main() 
{
    std::vector<int> v1 = { 1, 2 };
    std::vector<int> v2 = { 1, 2, 3 };
    std::vector<int> v3 = { 2 };

    std::cout << std::boolalpha << ( v1 < v2 ) << '\n';
    std::cout << std::lexicographical_compare( std::begin( v1 ), std::end( v1 ),
                                               std::begin( v2 ), std::end( v2 ) )
             << '\n';                                              

    std::cout << std::boolalpha << ( v1 < v3 ) << '\n';
    std::cout << std::lexicographical_compare( std::begin( v1 ), std::end( v1 ),
                                               std::begin( v3 ), std::end( v3 ) )
             << '\n';                                              

    std::cout << std::boolalpha << ( v2 < v3 ) << '\n';
    std::cout << std::lexicographical_compare( std::begin( v2 ), std::end( v2 ),
                                               std::begin( v3 ), std::end( v3 ) )
             << '\n';                                              

    return 0;
}

এর আউটপুট হয়

true
true
true
true
true
true

ক্লাসটি মানচিত্রে একটি কী হিসাবে ব্যবহার করা যেতে পারে।

ডিফল্টরূপে শ্রেণীর টেম্পলেট মানচিত্রটি স্ট্যান্ড ফাংশনটি স্ট্যান্ড ব্যবহার করে: পরিবর্তে অপারেটরটি ব্যবহার করে <কম

template <class Key, class T, class Compare = less<Key>,
class Allocator = allocator<pair<const Key, T>>>
class map 
{
    //...
};

তবে ক্লাস টেম্পলেট স্ট্যান্ড :: ভেক্টরের জন্য কোনও ওভারলোডেড অপারেটর নেই।


5
আমি সম্প্রতি আপনার উত্তরগুলি দেখতে প্রায় সমস্ত সি ++ এসও সংক্রান্ত প্রশ্নের মধ্যে দেখতে পেয়েছি, আমি জানি না আমার পুরো জীবনে আমি আপনাকে যা যা করতে চাই তা অর্জন করতে সক্ষম হবো কিনা তবে আমি যথাসাধ্য চেষ্টা করব। উত্তরের জন্য ধন্যবাদ
পুলকিত ভাটনগর

8

কোনও অবজেক্টের নাম এবং সেই বস্তুর বিষয়বস্তু সর্বদা সম্পর্কিত নয়।

operator ==কারণ std::vectorপ্রথমে ভেক্টরের দৈর্ঘ্যের তুলনা করা হবে এবং তারপরে এর প্রতিটি উপাদান operator ==পাশাপাশি ব্যবহার করবে।

operator <ভেক্টরের উপাদানগুলিকে লিক্সোগ্রাফিকভাবে তুলনা করে, অর্থাত্ এটি x[i] < y[i]ভেক্টরগুলিতে xএবং প্রথম অ-সম-উপাদানের জন্য প্রত্যাবর্তন করে y

এই std::mapহিসাবে ব্যবহৃত একটি ধরণের প্রয়োজনীয়তা Key। যেহেতু std::vectorউভয় সন্তুষ্ট, এটি হিসাবে ব্যবহার করা যেতে পারেKey । নোট করুন যে ভেক্টর দ্বারা পরিচালিত এই ধরণের কাজের জন্য এই অপারেটরগুলি ওভারলোড হওয়া আবশ্যক (কারণ std::vectorএটি নিজস্ব অপারেটরগুলি প্রয়োগ করতে সেই অপারেটরের উপর নির্ভর করে)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.