অ্যারের কতগুলি মূল্য আছে তা খুঁজে পাওয়ার কোনও উপায় আছে? আমি কোনও অ্যারের শেষে পৌঁছেছি কি না তা সনাক্ত করেও কাজ করবে।
অ্যারের কতগুলি মূল্য আছে তা খুঁজে পাওয়ার কোনও উপায় আছে? আমি কোনও অ্যারের শেষে পৌঁছেছি কি না তা সনাক্ত করেও কাজ করবে।
উত্তর:
আপনি যদি কোনও সি-স্টাইলের অ্যারে বলতে চান তবে আপনি এর মতো কিছু করতে পারেন:
int a[7];
std::cout << "Length of array = " << (sizeof(a)/sizeof(*a)) << std::endl;
এটি পয়েন্টারে কাজ করে না (উদাহরণস্বরূপ এটি নীচের কোনওটির জন্য কাজ করবে না ):
int *p = new int[7];
std::cout << "Length of array = " << (sizeof(p)/sizeof(*p)) << std::endl;
বা:
void func(int *p)
{
std::cout << "Length of array = " << (sizeof(p)/sizeof(*p)) << std::endl;
}
int a[7];
func(a);
সি ++ এ, আপনি যদি এই জাতীয় আচরণ চান তবে আপনার একটি ধারক শ্রেণীর ব্যবহার করা উচিত; সম্ভবত std::vector
।
অন্যের যেমন বলা হয়েছে আপনি এটি ব্যবহার করতে পারেন sizeof(arr)/sizeof(*arr)
তবে এটি আপনাকে পয়েন্টার টাইপের ভুল উত্তর দেবে যা অ্যারে নয়।
template<class T, size_t N>
constexpr size_t size(T (&)[N]) { return N; }
এটিতে অ অ্যারে প্রকারের জন্য সংকলন করতে ব্যর্থ হওয়ার দুর্দান্ত সম্পত্তি রয়েছে (ভিজ্যুয়াল স্টুডিওতে এটি রয়েছে _countof
)। constexpr
তাই এটি ম্যাক্রো বেশী কোনো অপূর্ণতা নেই (অন্তত কেউ এ আমি জানি) এই একটি কম্পাইল সময় অভিব্যক্তি করে তোলে।
আপনি std::array
সি ++ 11 থেকেও ব্যবহার বিবেচনা করতে পারেন যা একটি নেটিভ সি অ্যারের উপরে ওভারহেড ছাড়াই এর দৈর্ঘ্যটি প্রকাশ করে।
সি ++ 17 হয়েছে std::size()
এ <iterator>
হেডার যা একই করে এবং STL পাত্রে খুব (ধন্যবাদ জন্য কাজ করে @Jon সি )।
T(arg&)[N]
।
extent
, এখন এটির সাথে দুটি বৈশিষ্ট্য দেখছি যা এটি উপরের ফাংশনটির চেয়ে কম দরকারী করে তোলে (এই ব্যবহারের জন্য)। (1) এটি পয়েন্টারগুলির জন্য শূন্য প্রদান করে (সংকলনের ত্রুটির পরিবর্তে)। (২) এটিতে একটি টাইপ প্যারামিটার প্রয়োজন যাতে ভেরিয়েবলটি পরীক্ষা করতে আপনাকে করতে হবেdecltype
করার ফলে sizeof( myArray )
আপনি এই অ্যারের জন্য বরাদ্দকৃত মোট সংখ্যা পাবেন get তারপরে আপনি অ্যারেতে উপাদানগুলির সংখ্যাটি অ্যারের মধ্যে একটি উপাদানের আকার দ্বারা ভাগ করে খুঁজে পেতে পারেন:sizeof( myArray[0] )
যদিও এটি একটি পুরানো প্রশ্ন, এটি সি ++ 17 এর উত্তর আপডেট করার মতো। স্ট্যান্ডার্ড লাইব্রেরিতে এখন টেম্প্লেটেড ফাংশন রয়েছে std::size()
যা একটি স্ট্যান্ড কনটেইনার বা সি-স্টাইল অ্যারে উভয়ের উপাদানগুলির সংখ্যা প্রদান করে। উদাহরণ স্বরূপ:
#include <iterator>
uint32_t data[] = {10, 20, 30, 40};
auto dataSize = std::size(data);
// dataSize == 4
অ্যারের কতগুলি মূল্য আছে তা খুঁজে পাওয়ার কোনও উপায় আছে?
হ্যাঁ!
চেষ্টা sizeof(array)/sizeof(array[0])
আমি কোনও অ্যারের শেষে পৌঁছেছি কি না তা সনাক্ত করেও কাজ করবে।
আপনার অ্যারে অক্ষরের অ্যারে (অর্থাত্ স্ট্রিং) না হলে আমি এর জন্য কোনও উপায় দেখতে পাচ্ছি না
PS: সি ++ এ সর্বদা ব্যবহার করুন std::vector
। বেশ কয়েকটি ইনবিল্ট ফাংশন এবং বর্ধিত কার্যকারিতা রয়েছে।
std::vector
একটি পদ্ধতি রয়েছে size()
যা ভেক্টরের উপাদানগুলির সংখ্যা প্রদান করে।
(হ্যাঁ, এটি জিভ-ইন-গাল উত্তর)
#include <iostream>
int main ()
{
using namespace std;
int arr[] = {2, 7, 1, 111};
auto array_length = end(arr) - begin(arr);
cout << "Length of array: " << array_length << endl;
}
সি ++ 11 সাল থেকে অ্যারের দৈর্ঘ্যের সাথে ডিল করার সময় কিছু নতুন টেম্পলেটগুলি ব্যথা হ্রাস করতে সহায়তা করার জন্য প্রবর্তিত হয়। তাদের সমস্তই শিরোনামে সংজ্ঞায়িত করা হয় <type_traits>
।
যদি T
একটি অ্যারে টাইপ হয় তবে অ্যারের মাত্রার সংখ্যার সমান সদস্যের ধ্রুবক মান সরবরাহ করে। অন্য যে কোনও ধরণের জন্য মান 0 হয়।
যদি T
একটি অ্যারে টাইপ হয় N
তবে N
[0, std::rank<T>::value
) এ থাকলে অ্যারের ত্রিমাত্রিক সংখ্যার সাথে উপাদানের সংখ্যার সমান সদস্যের ধ্রুবক মান সরবরাহ করে । অন্য কোনও প্রকারের জন্য, বা T
অজানা অ্যারে যদি তার প্রথম মাত্রার সাথে আবদ্ধ হয় এবং N
0 হয় তবে মান 0 হয়।
যদি T
কোনও ধরণের অ্যারে হয় X
তবে সদস্য টাইপডেফ টাইপের সমান সরবরাহ করে X
, অন্যথায় টাইপ হয় T
। মনে রাখবেন যে যদি T
বহুমাত্রিক অ্যারে হয় তবে কেবলমাত্র প্রথম মাত্রা সরানো হবে।
std::remove_all_extents<T>::type
যদি T
কোনও ধরণের একটি বহুমাত্রিক অ্যারে হয় X
তবে সদস্য টাইপডেফ টাইপের সমান সরবরাহ করে X
, অন্যথায় টাইপ হয় T
।
একটি বহুমাত্রিক অ্যারের যে কোনও মাত্রায় দৈর্ঘ্য পেতে, decltype
একত্রিত করতে ব্যবহৃত হতে পারে std::extent
। উদাহরণ স্বরূপ:
#include <iostream>
#include <type_traits> // std::remove_extent std::remove_all_extents std::rank std::extent
template<class T, size_t N>
constexpr size_t length(T(&)[N]) { return N; }
template<class T, size_t N>
constexpr size_t length2(T(&arr)[N]) { return sizeof(arr) / sizeof(*arr); }
int main()
{
int a[5][4][3]{{{1,2,3}, {4,5,6}}, { }, {{7,8,9}}};
// New way
constexpr auto l1 = std::extent<decltype(a)>::value; // 5
constexpr auto l2 = std::extent<decltype(a), 1>::value; // 4
constexpr auto l3 = std::extent<decltype(a), 2>::value; // 3
constexpr auto l4 = std::extent<decltype(a), 3>::value; // 0
// Mixed way
constexpr auto la = length(a);
//constexpr auto lpa = length(*a); // compile error
//auto lpa = length(*a); // get at runtime
std::remove_extent<decltype(a)>::type pa; // get at compile time
//std::remove_reference<decltype(*a)>::type pa; // same as above
constexpr auto lpa = length(pa);
std::cout << la << ' ' << lpa << '\n';
// Old way
constexpr auto la2 = sizeof(a) / sizeof(*a);
constexpr auto lpa2 = sizeof(*a) / sizeof(**a);
std::cout << la2 << ' ' << lpa2 << '\n';
return 0;
}
বিটিওয়াই, একটি বহুমাত্রিক অ্যারেতে মোট উপাদানগুলির সংখ্যা পেতে:
constexpr auto l = sizeof(a) / sizeof(std::remove_all_extents<decltype(a)>::type);
অথবা এটি কোনও ফাংশন টেম্পলেটে রাখুন:
#include <iostream>
#include <type_traits>
template<class T>
constexpr size_t len(T &a)
{
return sizeof(a) / sizeof(typename std::remove_all_extents<T>::type);
}
int main()
{
int a[5][4][3]{{{1,2,3}, {4,5,6}}, { }, {{7,8,9}}};
constexpr auto ttt = len(a);
int i;
std::cout << ttt << ' ' << len(i) << '\n';
return 0;
}
এগুলি কীভাবে ব্যবহার করতে হয় তার আরও উদাহরণ লিঙ্কগুলি অনুসরণ করে পাওয়া যাবে।
টিআর 1 / সি ++ 11 / সি ++ 17 উপায় রয়েছে (এটি দেখুন Live on Coliru):
const std::string s[3] = { "1"s, "2"s, "3"s };
constexpr auto n = std::extent< decltype(s) >::value; // From <type_traits>
constexpr auto n2 = std::extent_v< decltype(s) >; // C++17 shorthand
const auto a = std::array{ "1"s, "2"s, "3"s }; // C++17 class template arg deduction -- http://en.cppreference.com/w/cpp/language/class_template_argument_deduction
constexpr auto size = std::tuple_size_v< decltype(a) >;
std::cout << n << " " << n2 << " " << size << "\n"; // Prints 3 3 3
বিল্ট ইন অ্যারে ফাংশন ওরফে ব্যবহার করার পরিবর্তে:
int x[3] = {0, 1, 2};
আপনার অ্যারে ক্লাস এবং অ্যারে টেম্পলেট ব্যবহার করা উচিত। চেষ্টা করুন:
#include <array>
array<type_of_the_array, number_of_elements_in_the_array> Name_of_Array = {};
সুতরাং এখন আপনি যদি অ্যারের দৈর্ঘ্য সন্ধান করতে চান, আপনাকে যা করতে হবে তা হ'ল অ্যারে শ্রেণিতে আকারের ফাংশনটি ব্যবহার করা।
Name_of_Array.size();
এবং এটি অ্যারের উপাদানগুলির দৈর্ঘ্যটি ফিরিয়ে আনবে।
সি ++ এ, অ্যারে ঘোষণা করার জন্য std :: অ্যারে শ্রেণি ব্যবহার করে, সহজেই একটি অ্যারের আকার এবং শেষ উপাদানটি খুঁজে পাওয়া যায়।
#include<iostream>
#include<array>
int main()
{
std::array<int,3> arr;
//To find the size of the array
std::cout<<arr.size()<<std::endl;
//Accessing the last element
auto it=arr.end();
std::cout<<arr.back()<<"\t"<<arr[arr.size()-1]<<"\t"<<*(--it);
return 0;
}
আসলে অ্যারে ক্লাসে অন্যান্য অনেকগুলি ফাংশন রয়েছে যা আমাদের অ্যারে স্ট্যান্ডার্ড কন্টেইনার ব্যবহার করতে দেয়।
রেফারেন্স 1 থেকে সি ++ স্টাড :: অ্যারে ক্লাস
রেফারেন্স 2 থেকে স্ট্যান্ড :: অ্যারে ক্লাস
রেফারেন্সগুলির উদাহরণগুলি সহায়ক are
এটি বেশ পুরানো এবং কিংবদন্তি প্রশ্ন এবং ইতিমধ্যে সেখানে অনেক আশ্চর্যজনক উত্তর রয়েছে। তবে সময়ের সাথে সাথে ভাষাগুলিতে নতুন কার্যকারিতা যুক্ত হচ্ছে, তাই নতুন বৈশিষ্ট্যগুলি উপলভ্য হিসাবে আমাদের আপডেট করা উচিত।
আমি কেবল লক্ষ্য করেছি যে এখনও পর্যন্ত কেউ C ++ 20 সম্পর্কে উল্লেখ করেনি। তাই উত্তর লিখতে ভেবেছি।
সি ++ তে, অ্যারের দৈর্ঘ্য সন্ধানের জন্য স্ট্যান্ডার্ড লাইব্রেরিতে আরও একটি নতুন উপায় যুক্ত হয়েছে std:ssize()
। এই ফাংশনটি a signed value
।
#include <iostream>
int main() {
int arr[] = {1, 2, 3};
std::cout << std::ssize(arr);
return 0;
}
সি ++ 17 এ এর জন্য আরও ভাল উপায় ছিল (সেই সময়ে) যা std::size()
সংজ্ঞায়িত হয়েছে iterator
।
#include <iostream>
#include <iterator> // required for std::size
int main(){
int arr[] = {1, 2, 3};
std::cout << "Size is " << std::size(arr);
return 0;
}
পিএস এই পদ্ধতিটি কাজ করে vector
পাশাপাশি কাজ করে।
এই প্রচলিত পদ্ধতির ইতিমধ্যে অন্যান্য অনেক উত্তরে উল্লেখ করা হয়েছে is
#include <iostream>
int main() {
int array[] = { 1, 2, 3 };
std::cout << sizeof(array) / sizeof(array[0]);
return 0;
}
শুধু এফওয়াইআই, আপনি যদি ভাবছেন যে কেন এই পদ্ধতিটি অ্যারে অন্য ফাংশনে যাওয়ার পরে কাজ করে না । কারণ,
একটি অ্যারে সি ++ তে মান দ্বারা পাস হয় না, পরিবর্তে অ্যারেতে পয়েন্টারটি পাস হয়। কিছু ক্ষেত্রে পুরো অ্যারে পাস করা ব্যয়বহুল অপারেশন হতে পারে। আপনি কিছু ফাংশনে অ্যারে পাস করে এটি পরীক্ষা করতে পারেন এবং সেখানে অ্যারেতে কিছু পরিবর্তন করতে পারেন এবং তারপরে আবার অ্যারেটি মুদ্রণ করুন। আপনি আপডেট ফলাফল পাবেন।
এবং আপনি ইতিমধ্যে জানতে হবে, sizeof()
ফাংশন বাইট সংখ্যা দেয়, তাই অন্যান্য ফাংশন এটি পুরো অ্যারের পরিবর্তে পয়েন্টার জন্য বরাদ্দ বাইট সংখ্যা ফিরে আসবে। সুতরাং এই পদ্ধতির কাজ করে না।
তবে আমি নিশ্চিত যে আপনার প্রয়োজন অনুসারে আপনি এটি করার একটি ভাল উপায় খুঁজে পেতে পারেন।
শুভ কোডিং।
আপনার কাছে সি অ্যারের আকার পেতে বিকল্পগুলির একটি গুচ্ছ রয়েছে।
int myArray [] = {0, 1, 2, 3, 4, 5, 7};
1) sizeof(<array>) / sizeof(<type>):
std::cout << "Size:" << sizeof(myArray) / sizeof(int) << std::endl;
2) sizeof(<array>) / sizeof(*<array>):
std::cout << "Size:" << sizeof(myArray) / sizeof(*myArray) << std::endl;
3) sizeof(<array>) / sizeof(<array>[<element>]):
std::cout << "Size:" << sizeof(myArray) / sizeof(myArray[0]) << std::endl;
এখানে এক বাস্তবায়ন ArraySize
থেকে গুগল Protobuf ।
#define GOOGLE_ARRAYSIZE(a) \
((sizeof(a) / sizeof(*(a))) / static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
// test codes...
char* ptr[] = { "you", "are", "here" };
int testarr[] = {1, 2, 3, 4};
cout << GOOGLE_ARRAYSIZE(testarr) << endl;
cout << GOOGLE_ARRAYSIZE(ptr) << endl;
আরআরআইজিজে (অ্যারে) আকারের (অ্যারে) (অ্যারেতে বাইটের # টি) এবং মাপের (* (আরআর)) (একটি অ্যারের উপাদানটিতে বাইটের #) পরিদর্শন করে কাজ করে। যদি পূর্ববর্তীটি পরবর্তীকালের দ্বারা বিভাজ্য হয় তবে সম্ভবত অ্যারেরটি অবশ্যই একটি অ্যারে হবে, সেক্ষেত্রে বিভাগের ফলাফলটি অ্যারের উপাদানগুলির # হয়। অন্যথায়, আরার সম্ভবত একটি অ্যারে হতে পারে না এবং কোডটি সংকলন থেকে রোধ করতে আমরা একটি সংকলক ত্রুটি উত্পন্ন করি।
যেহেতু বুলের আকারটি বাস্তবায়ন-সংজ্ঞায়িত, সুতরাং চূড়ান্ত ফলাফলটির আকার_তাই টাইপ রয়েছে তা নিশ্চিত করার জন্য আমাদের আকার (টি (ক) এবং আকারের (* (ক))) আকার দেওয়া উচিত!
এই ম্যাক্রোটি সঠিক নয় কারণ এটি ভুলভাবে নির্দিষ্ট পয়েন্টার গ্রহণ করে, যেখানে পয়েন্টার আকারটি পয়েন্টি আকার দ্বারা বিভাজ্য। যেহেতু আমাদের সমস্ত কোডটি একটি 32-বিট সংকলক যেতে হবে, যেখানে পয়েন্টারটি 4 বাইট হয়, এর অর্থ সমস্ত পয়েন্টার এমন ধরণের হয় যার আকার 3 বা 4 এর বেশি হয় (প্রত্যাখাতভাবে) প্রত্যাখ্যাত হবে।
int nombres[5] = { 9, 3 };
এই ফাংশনটির 5
পরিবর্তে ফিরে আসে 2
।
সি ++ / সিএক্সের জন্য (যখন ভিজ্যুয়াল স্টুডিওতে সি ++ ব্যবহার করে উদাহরণস্বরূপ ইউডাব্লুপি অ্যাপ্লিকেশন লেখার সময়) আমরা কেবল size()
ফাংশনটি ব্যবহার করে একটি অ্যারেতে মানগুলির সংখ্যা খুঁজে পেতে পারি ।
সোর্স কোড:
string myArray[] = { "Example1", "Example2", "Example3", "Example4" };
int size_of_array=size(myArray);
আপনি যদি আউটপুট হবে:cout
size_of_array
>>> 4
sizeof(array_name)
পুরো অ্যারের sizeof(int)
আকার দেয় এবং প্রতিটি অ্যারের উপাদানের ডেটা ধরণের আকার দেয়।
সুতরাং অ্যারের একক উপাদানের আকার দ্বারা পুরো অ্যারের আকার বিভাজক অ্যারের দৈর্ঘ্য দেয় ।
int array_name[] = {1, 2, 3, 4, 5, 6};
int length = sizeof(array_name)/sizeof(int);
উত্তর :
int number_of_elements = sizeof(array)/sizeof(array[0])
ব্যাখ্যা :
যেহেতু সংকলক প্রতিটি প্রকারের ডেটা আলাদা করে মেমরির একটি নির্দিষ্ট আকারের অংশ নির্ধারণ করে, এবং একটি অ্যারে কেবল সেগুলির একটি গ্রুপ, তাই আপনি কেবল অ্যারের আকারটি ডেটা টাইপের আকার দ্বারা বিভক্ত করেন। যদি আমার কাছে 30 টি স্ট্রিংয়ের অ্যারে থাকে তবে আমার সিস্টেম অ্যারের প্রতিটি উপাদান (স্ট্রিং) এর জন্য 24 বাইট আলাদা করে দেয়। 30 টি উপাদানগুলিতে, এটি মোট 720 বাইট। 720/24 == 30 টি উপাদান। এর জন্য ছোট, টাইট অ্যালগরিদমটি হ'ল:
int number_of_elements = sizeof(array)/sizeof(array[0])
যা সমান
number_of_elements = 720/24
মনে রাখবেন যে কাস্টম ডেটা টাইপ হলেও আপনার অ্যারে কী টাইপের টাইপ হয় তা জানা দরকার নেই।
কেবল একটি চিন্তাভাবনা, তবে কেবল একটি পাল্টা ভেরিয়েবল তৈরি করার সিদ্ধান্ত নিয়েছে এবং অ্যারের আকারটি অবস্থানের মধ্যে সংরক্ষণ করতে হবে [0]। আমি ফাংশনে আমার বেশিরভাগ কোড মুছে ফেলেছিলাম তবে আপনি লুপটি প্রস্থান করার পরে দেখতে পাবেন, প্রাইম [0] কে 'এ' এর চূড়ান্ত মান নির্ধারণ করা হবে। আমি ভেক্টর ব্যবহার করার চেষ্টা করেছি কিন্তু ভিএস এক্সপ্রেস 2013 এটি খুব বেশি পছন্দ হয়নি। এছাড়াও নোট করুন যে ওভাররাইটিং এড়ানোর জন্য 'এ' এক থেকে শুরু হয় [0] এবং ত্রুটিগুলি এড়ানোর জন্য এটি শুরুতে শুরু করা হয়েছিল। আমি কোনও বিশেষজ্ঞ নই, কেবল ভেবেছিলাম ভাগ করে নেব।
int prime[] = {0};
int primes(int x, int y){
using namespace std; int a = 1;
for (int i = x; i <= y; i++){prime[a] = i; a++; }
prime[0] = a; return 0;
}
জেনেরিক ব্যবহার করে এমন একটি ভাল সমাধান:
template <typename T,unsigned S>
inline unsigned arraysize(const T (&v)[S]) { return S; }
তারপরে arraysize(_Array);
অ্যারের দৈর্ঘ্য পেতে কেবল কল করুন ।
constexpr
ঠিক করা হয়েছে। inline
এটি না. constexpr
যদিও বেশ আধুনিক। আপনি কি নিশ্চিত যে আপনার পরীক্ষা প্রোগ্রামটি আর একটি আধুনিক বৈশিষ্ট্য ব্যবহার করছে না, যেখানে আপনি কোনও স্থানীয় অ্যারে ঘোষণা করতে পারেন যার দৈর্ঘ্যটি একটি ভেরিয়েবল দ্বারা দেওয়া হয়েছে? দুটি বিশ্বব্যাপী অ্যারে দিয়ে এটি ব্যবহার করে দেখুন।
পুরানো জি ++ সংকলকের জন্য, আপনি এটি করতে পারেন
template <class T, size_t N>
char (&helper(T (&)[N]))[N];
#define arraysize(array) (sizeof(helper(array)))
int main() {
int a[10];
std::cout << arraysize(a) << std::endl;
return 0;
}
আমি এখানে একটি জটিল সমাধান সরবরাহ করেছি:
আপনি সর্বদা length
প্রথম উপাদানটিতে সঞ্চয় করতে পারেন :
// malloc/new
arr[0] = length;
arr++;
// do anything.
int len = *(arr-1);
free(--arr);
--arr
প্রার্থনা করার সময় আপনাকে অবশ্যই খরচ করতে হবেfree
arr
কোনও ধরণের সাথে সামঞ্জস্য হয় int
এবং অ্যারের ধরণের সর্বাধিক মানের চেয়ে বেশি হয় না। যেমন পাস্কল স্ট্রিংগুলি আসলে এই কৌশলটি ব্যবহার করে বাইট অ্যারে হয়; পাস্কলে স্ট্রিংয়ের সর্বাধিক দৈর্ঘ্য 255 টি অক্ষর।
আপনি নিম্নলিখিত দ্বারা একটি অ্যারের দৈর্ঘ্য সন্ধান করতে পারেন:
int arr[] = {1, 2, 3, 4, 5, 6};
int size = *(&arr + 1) - arr;
cout << "Number of elements in arr[] is "<< size;
return 0;
কেবলমাত্র আপনি এই স্নিপেট ব্যবহার করতে পারেন:
#include <iostream>
#include <string>
#include <array>
using namespace std;
int main()
{
array<int,3> values;
cout << "No. elements in valuea array: " << values.size() << " elements." << endl;
cout << "sizeof(myints): " << sizeof(values) << endl;
}
এবং এখানে উল্লেখটি রয়েছে: http://www.cplusplus.com/references/array/array/size/
আকারের সাথে একসাথে টাইপটি ব্যবহার করা এড়িয়ে চলুন sizeof(array)/sizeof(char)
, হঠাৎ দূষিত হয়ে পড়লে আপনি অ্যারের ধরণটি পরিবর্তন করেন change
ভিজ্যুয়াল স্টুডিওতে আপনার সমতুল্য যদি থাকে sizeof(array)/sizeof(*array)
। আপনি কেবল টাইপ করতে পারেন_countof(array)
আমি ব্যক্তিগতভাবে পরামর্শ দিই (আপনি যদি কোনও কারণেই বিশেষায়িত ফাংশন নিয়ে কাজ করতে না পারেন) প্রথমে অ্যারে টাইপের সামঞ্জস্যতাটি প্রসারিত করার জন্য যা আপনি সাধারণত এটি ব্যবহার করবেন (যদি আপনি মান st 0:
unsigned int x[] -> int x[]
আপনি অ্যারের 1 এলিমেন্টটি তৈরি করার চেয়ে বড় করে তুলুন। শেষ উপাদানটির জন্য আপনি কিছু প্রকার স্থাপন করবেন যা প্রসারিত প্রকারের নির্দিষ্টকরণকারীর অন্তর্ভুক্ত রয়েছে তবে আপনি সাধারণত ব্যবহার করবেন না উদাহরণস্বরূপ পূর্ববর্তী উদাহরণটি ব্যবহার করে শেষ উপাদানটি -১ হবে। এটি আপনাকে (লুপের জন্য ব্যবহার করে) একটি অ্যারের শেষ উপাদানটি সন্ধান করতে সক্ষম করে।
আপনি এটি সন্ধান করার সবচেয়ে সাধারণ কারণগুলির মধ্যে একটি হ'ল কারণ আপনি কোনও ফাংশনে অ্যারে পাস করতে চান এবং এর আকারের জন্য অন্য কোনও যুক্তি পাস করতে হবে না। আপনি সাধারণত অ্যারের আকারটি গতিশীল হতে চান। এই অ্যারেতে বস্তুগুলি থাকতে পারে, আদিম নয়, এবং বস্তুগুলি এমন আকারের আকার_ফ (()) গণনা গণনা করার জন্য একটি নিরাপদ বিকল্প নয়।
অন্যরা যেমন পরামর্শ দিয়েছে, আদিম অ্যারের পরিবর্তে স্টাডি :: ভেক্টর বা তালিকা ইত্যাদি ব্যবহার বিবেচনা করুন। পুরানো সংকলকগুলিতে, তবে এখনও আপনার চূড়ান্ত সমাধান সম্ভবত আপনি সম্ভবত এটি করেই করতে পারবেন না যদিও পাত্রে পপুলেশন করার জন্য একগুচ্ছ কুৎসিত পুশ_ব্যাক () লাইন প্রয়োজন। আপনি যদি আমার মতো হন তবে বেনামে জড়িত জিনিসগুলির সাথে একটি একক লাইন সমাধান চান।
আপনি যদি কোনও আদিম অ্যারের বিকল্পের সাথে এসটিএল কনটেইনার নিয়ে যান তবে এই এসও পোস্টটি এটি আরম্ভ করার উপায়গুলির জন্য আপনার কাজে লাগতে পারে: হার্ডকোডযুক্ত উপাদানগুলির সাথে একটি স্টাড :: ভেক্টর আরম্ভ করার সহজতম উপায় কী?
এখানে একটি পদ্ধতি যা আমি এর জন্য ব্যবহার করছি যা সংকলক এবং প্ল্যাটফর্ম জুড়ে সর্বজনীনভাবে কাজ করবে:
আপনার অবজেক্টস সংগ্রহের জন্য ধারক হিসাবে একটি কাঠামো বা শ্রেণি তৈরি করুন। << জন্য অপারেটর ওভারলোড ফাংশনটি সংজ্ঞায়িত করুন।
class MyObject;
struct MyObjectList
{
std::list<MyObject> objects;
MyObjectList& operator<<( const MyObject o )
{
objects.push_back( o );
return *this;
}
};
আপনি আপনার ফাংশনগুলি প্যারামিটার হিসাবে গ্রহণ করতে পারেন, যেমন:
someFunc( MyObjectList &objects );
তারপরে, আপনি এই ফাংশনটি কল করতে পারেন, এটির মতো:
someFunc( MyObjectList() << MyObject(1) << MyObject(2) << MyObject(3) );
এইভাবে, আপনি একটি একক পরিষ্কার লাইনে কোনও ক্রিয়াকলাপে গতিশীল আকারের অবজেক্টগুলি সংগ্রহ এবং পাস করতে পারেন!
আপনাকে পৃষ্ঠার শীর্ষে ঘোষিত বিশ্বব্যাপী অ্যারে বলতে দেয়
int global[] = { 1, 2, 3, 4 };
অ্যারেতে কতগুলি উপাদান রয়েছে (সি ++ এ) নীচের কোডটি টাইপ করুন:
sizeof(global) / 4;
আকার (NAME_OF_ARRAY) / 4 আপনাকে প্রদত্ত অ্যারে নামের জন্য উপাদানগুলির সংখ্যা ফিরিয়ে দেবে।