আপনি কীভাবে পরীক্ষা করতে পারেন যে একটি উপাদান একটি সেটে রয়েছে?
নিম্নলিখিত কোডের একটি সহজ সমতুল্য আছে:
myset.find(x) != myset.end()
আপনি কীভাবে পরীক্ষা করতে পারেন যে একটি উপাদান একটি সেটে রয়েছে?
নিম্নলিখিত কোডের একটি সহজ সমতুল্য আছে:
myset.find(x) != myset.end()
উত্তর:
টিপিক্যাল উপায় যেমন অনেক Stl পাত্রে অস্তিত্ব জন্য চেক করতে std::map
, std::set
... হল:
const bool is_in = container.find(element) != container.end();
std::find(container.begin(), container.end(), element) != container.end()
; ও (এন) সমস্যাটি অবশ্যই রয়ে গেছে ...
if(container.find(foo) == container.end())
উপাদানটি প্রথমে সন্ধানের জন্য গাছের অনুসন্ধান করতে হবে - যদি এটি পাওয়া না যায় তবে সঠিক সন্নিবেশের অবস্থানটি খুঁজতে আপনাকে দ্বিতীয় গাছের অনুসন্ধান করতে হবে। মূল বৈকল্পিকটির আকর্ষণটি if(container.insert(foo).second) {...}
রয়েছে যে এটির জন্য কেবল একটি একক গাছ দেখার প্রয়োজন ...
set.contains(x)
সি ++ 20 স্ট্যান্ডার্ডে একটি বিল দেয়। আমি জানি না কেন এটি পেতে যে 2020 পর্যন্ত আমাদের নেয়া হচ্ছে।
কোনও উপাদান উপস্থিত রয়েছে কিনা তা সহজভাবে জানার অন্য উপায় হ'ল চেক করা count()
if (myset.count(x)) {
// x is in the set, count is 1
} else {
// count zero, i.e. x not in the set
}
তবে বেশিরভাগ সময়, আমি নিজেকে যেখানেই উপাদানটির অস্তিত্বের জন্য যাচাই করি সেখানে অ্যাক্সেসের প্রয়োজন মনে করি।
সুতরাং আমি যাই হোক না কেন পুনরুক্তি খুঁজে পেতে হবে। তারপরে অবশ্যই এটির সাথে তুলনা করা ভাল end
।
set< X >::iterator it = myset.find(x);
if (it != myset.end()) {
// do something with *it
}
সি ++ 20
সি ++ তে 20 সেটে একটি contains
ক্রিয়াকলাপ পাওয়া যায়, সুতরাং নিম্নলিখিতটি উল্লেখ করা সম্ভব হয়: https://stackoverflow.com/a/54197839/895245
if (myset.contains(x)) {
// x is in the set
} else {
// no x
}
count()
পরিবর্তে ব্যবহার find()
করা কখনও ভাল তবে সম্ভাব্যতর খারাপ হয় না। এটি কারণ find()
প্রথম ম্যাচের পরে ফিরে count()
আসবে, সর্বদা সমস্ত উপাদানগুলির সাথে পুনরাবৃত্তি করবে।
multiset
এবং multimap
আমি ভেবেছিলাম? এখনও যদিও নির্দেশ :) ভাল
set
কোনও সদস্যের সাথে মেলে এটি কেবল সম্ভব , তাই পিটারটি বলে যে, এই উপাদানটি প্রথম উপাদান চিহ্নিত করার পরে থামার মতো কার্যকর হবে না? যে কোনও ক্ষেত্রে কার্যকর উত্তর!
count()
কখনই তার চেয়ে দ্রুত হবে না find()
) এখনও ধরে, দ্বিতীয় অংশটি প্রকৃতপক্ষে প্রযোজ্য নয় std::set
। যাইহোক, আমি অনুমান করি যে আরও একটি যুক্তি পক্ষে পক্ষে তৈরি করা যেতে পারে find()
: এটি আরও অভিব্যক্তিপূর্ণ, অর্থাত্ জোর দেয় যে আপনি ঘটনার সংখ্যা গণনা না করে কোনও উপাদান সন্ধান করার চেষ্টা করছেন।
কেবল পরিষ্কার করার জন্য, contains()
এই ধারক ধরণের মতো কোনও সদস্য না থাকার কারণ হ'ল এটি আপনাকে অক্ষম কোড লেখার জন্য উন্মুক্ত করবে। এই জাতীয় পদ্ধতি সম্ভবত this->find(key) != this->end()
অভ্যন্তরীণভাবে কেবলমাত্র করবে , তবে কীটি প্রকৃতপক্ষে উপস্থিত থাকলে আপনি কী করবেন তা বিবেচনা করুন; বেশিরভাগ ক্ষেত্রে আপনি তখন উপাদানটি পেতে এবং এটি দিয়ে কিছু করতে চান। এর অর্থ আপনাকে একটি সেকেন্ড করতে হবে find()
, যা অদক্ষ। সরাসরি অনুসন্ধান করা আরও ভাল, যাতে আপনি নিজের ফলাফলটি ক্যাশে করতে পারেন:
auto it = myContainer.find(key);
if (it != myContainer.end())
{
// Do something with it, no more lookup needed.
}
else
{
// Key was not present.
}
অবশ্যই, যদি আপনি দক্ষতার বিষয়ে চিন্তা না করেন তবে আপনি সর্বদা নিজের রোল করতে পারেন তবে সেক্ষেত্রে আপনার সম্ভবত সি ++ ব্যবহার করা উচিত নয় ...;)
list::remove
, remove(makes_sense_only_for_vector, iterators)
...)
ইন সি ++ 20 পরিশেষে আমরা কিনবো std::set::contains
পদ্ধতি।
#include <iostream>
#include <string>
#include <set>
int main()
{
std::set<std::string> example = {"Do", "not", "panic", "!!!"};
if(example.contains("panic")) {
std::cout << "Found\n";
} else {
std::cout << "Not found\n";
}
}
আপনি যদি কোনও contains
ফাংশন যুক্ত করতে যাচ্ছেন তবে এটি দেখতে এরকম হতে পারে:
#include <algorithm>
#include <iterator>
template<class TInputIterator, class T> inline
bool contains(TInputIterator first, TInputIterator last, const T& value)
{
return std::find(first, last, value) != last;
}
template<class TContainer, class T> inline
bool contains(const TContainer& container, const T& value)
{
// This works with more containers but requires std::begin and std::end
// from C++0x, which you can get either:
// 1. By using a C++0x compiler or
// 2. Including the utility functions below.
return contains(std::begin(container), std::end(container), value);
// This works pre-C++0x (and without the utility functions below, but doesn't
// work for fixed-length arrays.
//return contains(container.begin(), container.end(), value);
}
template<class T> inline
bool contains(const std::set<T>& container, const T& value)
{
return container.find(value) != container.end();
}
এটি std::set
অন্যান্য এসটিএল ধারক এবং এমনকি স্থির দৈর্ঘ্যের অ্যারেগুলির সাথে কাজ করে:
void test()
{
std::set<int> set;
set.insert(1);
set.insert(4);
assert(!contains(set, 3));
int set2[] = { 1, 2, 3 };
assert(contains(set2, 3));
}
মন্তব্যে নির্দেশিত হিসাবে, আমি অজান্তেই সি ++ 0 এক্স ( std::begin
এবং std::end
) তে নতুন একটি ফাংশন ব্যবহার করেছি । এখানে VS2010 এর কাছাকাছি তুচ্ছ বাস্তবায়ন:
namespace std {
template<class _Container> inline
typename _Container::iterator begin(_Container& _Cont)
{ // get beginning of sequence
return (_Cont.begin());
}
template<class _Container> inline
typename _Container::const_iterator begin(const _Container& _Cont)
{ // get beginning of sequence
return (_Cont.begin());
}
template<class _Container> inline
typename _Container::iterator end(_Container& _Cont)
{ // get end of sequence
return (_Cont.end());
}
template<class _Container> inline
typename _Container::const_iterator end(const _Container& _Cont)
{ // get end of sequence
return (_Cont.end());
}
template<class _Ty,
size_t _Size> inline
_Ty *begin(_Ty (&_Array)[_Size])
{ // get beginning of array
return (&_Array[0]);
}
template<class _Ty,
size_t _Size> inline
_Ty *end(_Ty (&_Array)[_Size])
{ // get end of array
return (&_Array[0] + _Size);
}
}
std::set
, এবং মনে রাখবেন যে এটি শুধুমাত্র সঠিক যদি শুধুমাত্র জিনিস আপনাকে জানতে হবে অস্তিত্ব।
উপাদানটি সন্নিবেশ করার সময় কোনও উপাদান সেট রয়েছে কিনা তাও আপনি পরীক্ষা করতে পারেন। একক উপাদান সংস্করণটি তার সদস্য জুটি সহ একটি জুড়ি ফেরত দেয়: প্রথমে একটি পুনরায় আবরণকারীকে সেট করা হয় সদ্য সন্নিবেশ করা উপাদানটির সাথে বা ইতিমধ্যে সেটে থাকা সমতুল্য উপাদানের দিকে নির্দেশ করে। জোড় :: জোড়ায় দ্বিতীয় উপাদানটি যদি সেট করা থাকে যে কোনও নতুন উপাদান inোকানো হয়েছে বা মিথ্যা যদি কোনও সমমানের উপাদান ইতিমধ্যে বিদ্যমান থাকে।
উদাহরণস্বরূপ: ধরুন সেটটিতে ইতিমধ্যে একটি উপাদান হিসাবে 20 রয়েছে।
std::set<int> myset;
std::set<int>::iterator it;
std::pair<std::set<int>::iterator,bool> ret;
ret=myset.insert(20);
if(ret.second==false)
{
//do nothing
}
else
{
//do something
}
it=ret.first //points to element 20 already in set.
জোড়ের তুলনায় উপাদানটি নতুন isোকানো থাকলে :: প্রথমে সেটটিতে নতুন উপাদানটির অবস্থান নির্দেশ করবে।
আপনার নিজের লিখুন:
template<class T>
bool checkElementIsInSet(const T& elem, const std::set<T>& container)
{
return container.find(elem) != container.end();
}
আমি ব্যবহার করি
if(!my_set.count(that_element)) //Element is present...
;
তবে এটি তেমন দক্ষ নয়
if(my_set.find(that_element)!=my_set.end()) ....;
আমার সংস্করণটি কোডটি লেখার ক্ষেত্রে কেবল আমার সময় সাশ্রয় করে। আমি প্রতিযোগিতামূলক কোডিংয়ের জন্য এটিকে পছন্দ করি।
count()
,। বুলিয়ান এক্সপ্রেশনটিতে ব্যবহৃত পূর্ণসংখ্যা-ফেরত ফাংশনটি শূন্য-অ-শূন্যের জন্য পরীক্ষা করা হচ্ছে তা বুঝতে অক্ষম যে কেউ সি / সি ++ বুদ্ধিমানের দুর্দান্ত সমুদ্রে অনেকগুলি, আরও অনেক ট্র্যাভেল পাবে। এবং, উপরে উল্লিখিত হিসাবে, সেটগুলির জন্য সত্যই দক্ষ হওয়া উচিত, যা ছিল প্রশ্ন।
আমি এর contains
জন্য একটি সাধারণ ফাংশন লিখতে সক্ষম হয়েছি std::list
এবং std::vector
,
template<typename T>
bool contains( const list<T>& container, const T& elt )
{
return find( container.begin(), container.end(), elt ) != container.end() ;
}
template<typename T>
bool contains( const vector<T>& container, const T& elt )
{
return find( container.begin(), container.end(), elt ) != container.end() ;
}
// use:
if( contains( yourList, itemInList ) ) // then do something
এটি সিনট্যাক্সটি কিছুটা সাফ করে।
তবে এই কাজটি স্বেচ্ছাসেবী স্টাইলের পাত্রে তৈরি করতে আমি টেমপ্লেট টেম্পলেট প্যারামিটার যাদু ব্যবহার করতে পারি না ।
// NOT WORKING:
template<template<class> class STLContainer, class T>
bool contains( STLContainer<T> container, T elt )
{
return find( container.begin(), container.end(), elt ) != container.end() ;
}
শেষ উত্তরটি উন্নত করার বিষয়ে কোনও মন্তব্য দুর্দান্ত হবে।
template<typename CONTAINER, typename CONTAINEE> bool contains(const CONTAINER& container, const CONTAINEE& needle) { return find(container.begin(), container.end(), needle) != container.end();
// সাধারণ সিনট্যাক্স
set<int>::iterator ii = find(set1.begin(),set1.end(),"element to be searched");
/ * নীচে কোডে আমি উপাদান 4 ইনট এবং ইনট সেট উপস্থিত থাকলে এটি উপস্থিত কিনা তা চেষ্টা করার চেষ্টা করছি * /
set<int>::iterator ii = find(set1.begin(),set1.end(),4);
if(ii!=set1.end())
{
cout<<"element found";
set1.erase(ii);// in case you want to erase that element from set.
}