আমি একটি অ্যারের দৈর্ঘ্যটি কীভাবে খুঁজে পাব?


538

অ্যারের কতগুলি মূল্য আছে তা খুঁজে পাওয়ার কোনও উপায় আছে? আমি কোনও অ্যারের শেষে পৌঁছেছি কি না তা সনাক্ত করেও কাজ করবে।


22
অ্যারে কোথা থেকে আসছে? সাধারণত অ্যারে নেওয়া ফাংশনগুলি এই সমস্যাটি মোকাবেলায় দৈর্ঘ্যের পরামিতিও নেয়।
মাইকেল ময়র্স

2
ঠিক আছে, আমি একটি "পাগল libs" প্রোগ্রাম তৈরি করছি যা সমস্ত পাঠ্যের সাথে একটি অ্যারে রয়েছে, পাশাপাশি ব্যবহারকারীকে যে বিশেষ্য / ক্রিয়াগুলি ভরাট করতে হবে তার অবস্থানগুলিও রয়েছে: আমি একটি ফাংশন ব্যবহার করতে চাই সম্পূর্ণ অ্যারে, "[বিশেষ্য]" এবং "[ক্রিয়া]" মানগুলি ব্যবহারকারীর দ্বারা প্রবেশ করা পাঠ্যের সাথে প্রতিস্থাপন করে।
ম্যাক্সপাম


5
দয়া করে নোট করুন যে সি অ্যারেগুলিতে বস্তু বা কাঠামো নয়। যেমন, তাদের ডিফল্টরূপে কোথাও কোনও দৈর্ঘ্যের প্যারামিটার সঞ্চয় নেই। আপনি যদি তাদের সাথে সি ++ তে অবজেক্টস হিসাবে কাজ করতে চান তবে সি ++ অবজেক্টস স্ট্যান্ড :: ভেক্টর, বা স্টাডি :: যদি আপনি পারেন তবে সি ++ 11 এর অ্যারে ব্যবহার করুন। আপনার যদি পয়েন্টার ব্যবহার করতে হয় তবে সর্বদা এটির সাথে কাজ করে এমন প্রতিটি ফাংশনে দ্বিতীয় প্যারামিটার হিসাবে অ্যারের দৈর্ঘ্য দিন।
পাইহান

আপনি যদি C ++ 20 ব্যবহার করেন তবে আমি তার জন্য উত্তরও যুক্ত করেছি। এখানে অনেক উত্তর রয়েছে বলে এটি সহজেই মিস হতে পারে।
gprathour

উত্তর:


510

আপনি যদি কোনও সি-স্টাইলের অ্যারে বলতে চান তবে আপনি এর মতো কিছু করতে পারেন:

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


86
আপনি যদি অ্যারেটিকে অন্য কোনও ফাংশনে পাস করে সেখানে চেষ্টা করার চেষ্টা করেন তবে এটিও কাজ করে না :)
সান জ্যাকিন্তো

23
@ সান জ্যাকিন্টো: না, এটি ( অ্যারেগুলিতে ) কাজ করে আপনি কোনও ফাংশনেই থাকুন না কেন, তবে প্যারামিটার হিসাবে কোনও ফাংশনে পরিবর্তনশীল দৈর্ঘ্যের অ্যারে পাস করা অসম্ভব (এটি একটি পয়েন্টারে পরিণত হয়) - তবে আপনি যদি একটি পাস করেন তবে একটি কাঠামোর ভিতরে অ্যারে, তারপরে এটি প্রত্যাশার মতো কাজ করে।
eq-

1
@ অলিভারচারসওয়ার্থ এছাড়াও যদি আপনি অন্য কোনও ফাংশনের জন্য মূল্য দিয়ে অ্যারেটি পাস করে সেখানে চেষ্টা করে থাকেন, কাজ করবে না, তাই না? প্রশ্নটি কেন
এ_মাতার

5
@ এ_মাতার - আপনি সি বা সি ++ এ মান দিয়ে কোনও অ্যারে পাস করতে পারবেন না।
অলিভার চার্লসওয়ার্থ

1
@ ইউশা - তারা একই জিনিস।
অলিভার চার্লসওয়ার্থ

142

অন্যের যেমন বলা হয়েছে আপনি এটি ব্যবহার করতে পারেন 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 সি )।


3
@ আপনি কীভাবে অ্যারেতে রেফারেন্স লিখবেন , এই উত্তরটি দেখুন । প্যারামিটারটি ব্যবহার না করায় আমার সংস্করণটি কিছুটা পৃথক দেখাচ্ছে কারণ কেবলমাত্র প্যারামিটারটি ব্যবহার করা হয়নি, কেবল তার ধরণের প্রয়োজন। একটি নাম সঙ্গে এটি হবে T(arg&)[N]
মোটি

1
থ্যাঙ্কস মোটি! বাম আউট প্যারামিটারের নামটি আমার কাছে ইতিমধ্যে পরিষ্কার ছিল। তবে অবিশ্বাস্য যে আমার স্পষ্টতই এর আগে অ্যারেতে রেফ / পয়েন্টারগুলির কোনও ব্যবহার ছিল না । এবং সম্ভবত ভবিষ্যতে হবে না, যেমন অ্যারেগুলি আরও বেশি মারা যাচ্ছে d
Yau


1
যদি সি ++ 11 ব্যবহার করা হয় তবে এই স্ট্যান্ডিং নয়: পরিধি এর থেকে ভাল সমাধান ???? en.cppreferences.com/w/cpp/tyype/extent
আইজাক

2
@ আইস্যাকপ্যাসিকাল আমি এর সাথে পরিচিত ছিলাম না extent, এখন এটির সাথে দুটি বৈশিষ্ট্য দেখছি যা এটি উপরের ফাংশনটির চেয়ে কম দরকারী করে তোলে (এই ব্যবহারের জন্য)। (1) এটি পয়েন্টারগুলির জন্য শূন্য প্রদান করে (সংকলনের ত্রুটির পরিবর্তে)। (২) এটিতে একটি টাইপ প্যারামিটার প্রয়োজন যাতে ভেরিয়েবলটি পরীক্ষা করতে আপনাকে করতে হবেdecltype
মোটি

86

করার ফলে sizeof( myArray )আপনি এই অ্যারের জন্য বরাদ্দকৃত মোট সংখ্যা পাবেন get তারপরে আপনি অ্যারেতে উপাদানগুলির সংখ্যাটি অ্যারের মধ্যে একটি উপাদানের আকার দ্বারা ভাগ করে খুঁজে পেতে পারেন:sizeof( myArray[0] )


3
এটি একটি পুরানো সমস্যা বলে মনে হচ্ছে যা কাটিয়ে উঠতে এটি একটি খুব সহজ এবং সহজ সমাধান।

4
পয়েন্টার ধরে রাখা সি ++ "নতুন" অ্যারেগুলির জন্য কাজ করে না। আপনি যদি পয়েন্টার (4 বাইট) এর আকার বা এর প্রথম উপাদানটির আকার পান তবে আপনি যদি এটিকে অবলম্বন করেন।
ড্রাগনলর্ড

1
@ ড্রাগনলর্ড হ্যাঁ, যদিও নতুন কীওয়ার্ডটি ব্যবহার করে অ্যারের আকারটি ঘোষণা করা যে কেউ রানটাইমের সময় ইতিমধ্যে অ্যারের আকার জানতে পারে, সুতরাং সেক্ষেত্রে অ্যারের আকারটি খুঁজে পেতে সাইজেরফ অপারেটরটি ব্যবহার করার দরকার নেই। আমি নিশ্চিত আপনি এটি জানেন। এটি কেবল যে কারও পক্ষে নয় the
মার্টিন শট

@ সুরেগা এটি দুর্ঘটনা ঘটবে না
সিআইটিবিএল

60

যদিও এটি একটি পুরানো প্রশ্ন, এটি সি ++ 17 এর উত্তর আপডেট করার মতো। স্ট্যান্ডার্ড লাইব্রেরিতে এখন টেম্প্লেটেড ফাংশন রয়েছে std::size()যা একটি স্ট্যান্ড কনটেইনার বা সি-স্টাইল অ্যারে উভয়ের উপাদানগুলির সংখ্যা প্রদান করে। উদাহরণ স্বরূপ:

#include <iterator>

uint32_t data[] = {10, 20, 30, 40};
auto dataSize = std::size(data);
// dataSize == 4

58

অ্যারের কতগুলি মূল্য আছে তা খুঁজে পাওয়ার কোনও উপায় আছে?

হ্যাঁ!

চেষ্টা sizeof(array)/sizeof(array[0])

আমি কোনও অ্যারের শেষে পৌঁছেছি কি না তা সনাক্ত করেও কাজ করবে।

আপনার অ্যারে অক্ষরের অ্যারে (অর্থাত্ স্ট্রিং) না হলে আমি এর জন্য কোনও উপায় দেখতে পাচ্ছি না

PS: সি ++ এ সর্বদা ব্যবহার করুন std::vector। বেশ কয়েকটি ইনবিল্ট ফাংশন এবং বর্ধিত কার্যকারিতা রয়েছে।


এটি পরিবর্তনশীল স্বতন্ত্র অ্যারে আকারগুলির জন্য কাজ করবে না
ডন ল্যারিনেক্স

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

@ মার্টিনশুট আপনি যখন গেমদেবের মতো ক্যাশে-আবদ্ধ হন, আপনি কখনও কখনও ভেক্টর ব্যবহারের সামর্থ্য রাখেন না।
তারা

30

std::vectorএকটি পদ্ধতি রয়েছে size()যা ভেক্টরের উপাদানগুলির সংখ্যা প্রদান করে।

(হ্যাঁ, এটি জিভ-ইন-গাল উত্তর)


10
গালে জিহ্বা হতে পারে তবে এটি অবশ্যই সঠিক পন্থা।
জেরি কফিন

গালে জিভ বলে কেন? আমার কাছে (একটি সি ++ নবাগত) এটি সঠিক উত্তর বলে মনে হচ্ছে।
dbliss

6
@dbliss এটি জিহ্বা-ইন-গাল কারণ ওপি একটি অ্যারের দৈর্ঘ্য সম্পর্কে জিজ্ঞাসা করেছিল এবং তাদের জিজ্ঞাসা করে যে কীভাবে কোনও ভেক্টরের দৈর্ঘ্য পাবেন , যা সি ++ এ আলাদা জিনিস। যাইহোক, এটি একটি গভীর স্তরে সঠিক কারণ আপনার যদি রানের সময় দৈর্ঘ্য পেতে হয় তবে একটি ভেক্টর আরও ভাল পছন্দ
পুলি

আপনি বিশ্বাস করি std :: তালিকা বা অন্য কিছু ধারকও ব্যবহার করতে পারেন।
বুভিনজে

1
এই উত্তরটির সম্পর্কে বিশেষত দুর্দান্ত যা হ'ল আপনি কোনও ভেক্টর শুরু করতে পারেন বা অ্যারে আক্ষরিক সাথে তালিকা তৈরি করতে পারেন।
বুভিনজে

26
#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;
}

10
আমি বিশ্বাস করি এটি কেবল স্থানীয় ভেরিয়েবলের জন্য কাজ করে যা স্ট্যাকের মধ্যে রয়েছে।
ড্রাগনলর্ড

এটি সেরা উত্তর। @ ড্রাগনলর্ড, এটি সদস্য যুদ্ধের জন্যও কাজ করে। Cpp.sh/92xvv দেখুন ।
শীতল শাহ

24

সি ++ 11 সাল থেকে অ্যারের দৈর্ঘ্যের সাথে ডিল করার সময় কিছু নতুন টেম্পলেটগুলি ব্যথা হ্রাস করতে সহায়তা করার জন্য প্রবর্তিত হয়। তাদের সমস্তই শিরোনামে সংজ্ঞায়িত করা হয় <type_traits>

  • std::rank<T>::value

    যদি Tএকটি অ্যারে টাইপ হয় তবে অ্যারের মাত্রার সংখ্যার সমান সদস্যের ধ্রুবক মান সরবরাহ করে। অন্য যে কোনও ধরণের জন্য মান 0 হয়।

  • std::extent<T, N>::value

    যদি Tএকটি অ্যারে টাইপ হয় Nতবে N[0, std::rank<T>::value) এ থাকলে অ্যারের ত্রিমাত্রিক সংখ্যার সাথে উপাদানের সংখ্যার সমান সদস্যের ধ্রুবক মান সরবরাহ করে । অন্য কোনও প্রকারের জন্য, বা Tঅজানা অ্যারে যদি তার প্রথম মাত্রার সাথে আবদ্ধ হয় এবং N0 হয় তবে মান 0 হয়।

  • std::remove_extent<T>::type

    যদি 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;
}

এগুলি কীভাবে ব্যবহার করতে হয় তার আরও উদাহরণ লিঙ্কগুলি অনুসরণ করে পাওয়া যাবে।


18

টিআর 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

9

বিল্ট ইন অ্যারে ফাংশন ওরফে ব্যবহার করার পরিবর্তে:

 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();

এবং এটি অ্যারের উপাদানগুলির দৈর্ঘ্যটি ফিরিয়ে আনবে।


6

সি ++ এ, অ্যারে ঘোষণা করার জন্য 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


2
নিস; আমি দেখছি আপনি অনেক দক্ষতা পেয়েছি; এবং ... দুর্দান্ত পদ্ধতির আমার কাছেও এই জাতীয় বিখ্যাত প্রশ্নের আরও উত্তর লিখতে হবে বলে আমার মনে হয় ;-)
ঘোস্টট্যাগ

5

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

আমি কেবল লক্ষ্য করেছি যে এখনও পর্যন্ত কেউ C ++ 20 সম্পর্কে উল্লেখ করেনি। তাই উত্তর লিখতে ভেবেছি।

সি ++ 20

সি ++ তে, অ্যারের দৈর্ঘ্য সন্ধানের জন্য স্ট্যান্ডার্ড লাইব্রেরিতে আরও একটি নতুন উপায় যুক্ত হয়েছে std:ssize()। এই ফাংশনটি a signed value

#include <iostream>

int main() {
    int arr[] = {1, 2, 3};
    std::cout << std::ssize(arr);
    return 0;
}

সি ++ 17

সি ++ 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() ফাংশন বাইট সংখ্যা দেয়, তাই অন্যান্য ফাংশন এটি পুরো অ্যারের পরিবর্তে পয়েন্টার জন্য বরাদ্দ বাইট সংখ্যা ফিরে আসবে। সুতরাং এই পদ্ধতির কাজ করে না।

তবে আমি নিশ্চিত যে আপনার প্রয়োজন অনুসারে আপনি এটি করার একটি ভাল উপায় খুঁজে পেতে পারেন।

শুভ কোডিং।


4

আপনার কাছে সি অ্যারের আকার পেতে বিকল্পগুলির একটি গুচ্ছ রয়েছে।

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;

3

এখানে এক বাস্তবায়ন 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
আনোয়ার

GOOGLE_ARRAYSIZE(new int8_t)8ত্রুটি বাড়াতে পরিবর্তে আমার পরীক্ষার এনভির উপর ফেরত দেয়। কাটা অংশটি অপ্রয়োজনীয় বলে মনে হচ্ছে, চিৎকারকারী সি ম্যাক্রোর উল্লেখ নেই। sizeof(a) / sizeof(*a)উত্তরাধিকার সমাধান হিসাবে যথেষ্ট কাজ করে।

3

সি ++ / সিএক্সের জন্য (যখন ভিজ্যুয়াল স্টুডিওতে সি ++ ব্যবহার করে উদাহরণস্বরূপ ইউডাব্লুপি অ্যাপ্লিকেশন লেখার সময়) আমরা কেবল size()ফাংশনটি ব্যবহার করে একটি অ্যারেতে মানগুলির সংখ্যা খুঁজে পেতে পারি ।

সোর্স কোড:

string myArray[] = { "Example1", "Example2", "Example3", "Example4" };
int size_of_array=size(myArray);

আপনি যদি আউটপুট হবে:coutsize_of_array

>>> 4

3

sizeof(array_name)পুরো অ্যারের sizeof(int)আকার দেয় এবং প্রতিটি অ্যারের উপাদানের ডেটা ধরণের আকার দেয়।

সুতরাং অ্যারের একক উপাদানের আকার দ্বারা পুরো অ্যারের আকার বিভাজক অ্যারের দৈর্ঘ্য দেয় ।

 int array_name[] = {1, 2, 3, 4, 5, 6};
 int length = sizeof(array_name)/sizeof(int);

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

3

উত্তর :

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

মনে রাখবেন যে কাস্টম ডেটা টাইপ হলেও আপনার অ্যারে কী টাইপের টাইপ হয় তা জানা দরকার নেই।


2019 সালে এই পুরানো এবং ত্রুটিযুক্ত প্রবণ পদ্ধতির দরকার নেই st stackoverflow.com/a/59109106/560648 এছাড়াও এটি বিদ্যমান উত্তরের মাত্র একটি দ্বিগুণ।
অরবিটে

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

1

কেবল একটি চিন্তাভাবনা, তবে কেবল একটি পাল্টা ভেরিয়েবল তৈরি করার সিদ্ধান্ত নিয়েছে এবং অ্যারের আকারটি অবস্থানের মধ্যে সংরক্ষণ করতে হবে [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;
}

1

জেনেরিক ব্যবহার করে এমন একটি ভাল সমাধান:

template <typename T,unsigned S>
inline unsigned arraysize(const T (&v)[S]) { return S; }

তারপরে arraysize(_Array);অ্যারের দৈর্ঘ্য পেতে কেবল কল করুন ।

সূত্র


@ ববোগোগো ইনলাইন বা কনটেক্সপ্রপের সাথে কাজ করে, সম্ভবত আপনি ইনলাইন বন্ধ করেছেন বা এটি alচ্ছিক? আইডোন.ও.ভিএক্সোগজে 4
কোয়ান্টিনুক

@ কেন্টিন ইউকে constexprঠিক করা হয়েছে। inlineএটি না. constexprযদিও বেশ আধুনিক। আপনি কি নিশ্চিত যে আপনার পরীক্ষা প্রোগ্রামটি আর একটি আধুনিক বৈশিষ্ট্য ব্যবহার করছে না, যেখানে আপনি কোনও স্থানীয় অ্যারে ঘোষণা করতে পারেন যার দৈর্ঘ্যটি একটি ভেরিয়েবল দ্বারা দেওয়া হয়েছে? দুটি বিশ্বব্যাপী অ্যারে দিয়ে এটি ব্যবহার করে দেখুন।
বোবোগো

1

পুরানো জি ++ সংকলকের জন্য, আপনি এটি করতে পারেন

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;
}

এটা সঠিক উত্তর. সি ++ সংস্করণগুলির মধ্যে অত্যন্ত পোর্টেবল, পয়েন্টারগুলির সাথে কাজ করে না, সাথে সাথে উত্তরগুলি সংকলন সময়ে পাওয়া যায়
bobogo

1

আমি এখানে একটি জটিল সমাধান সরবরাহ করেছি:

আপনি সর্বদা lengthপ্রথম উপাদানটিতে সঞ্চয় করতে পারেন :

// malloc/new

arr[0] = length;
arr++;

// do anything. 
int len = *(arr-1);

free(--arr); 

--arrপ্রার্থনা করার সময় আপনাকে অবশ্যই খরচ করতে হবেfree


2
এটি কেবল তখনই কাজ করে যখন arrকোনও ধরণের সাথে সামঞ্জস্য হয় intএবং অ্যারের ধরণের সর্বাধিক মানের চেয়ে বেশি হয় না। যেমন পাস্কল স্ট্রিংগুলি আসলে এই কৌশলটি ব্যবহার করে বাইট অ্যারে হয়; পাস্কলে স্ট্রিংয়ের সর্বাধিক দৈর্ঘ্য 255 টি অক্ষর।
প্লেক

আমি মনে করি যে প্রতিটি অ্যারের শুরুতে 8 টি বাইট বলতে পারে এবং যদি তারা অবজেক্টগুলি সঞ্চয় করতে চায় তবে স্বাক্ষরবিহীন দীর্ঘ ব্যবহার করতে পারে। আমি মনে করি কোনও ভেক্টর সম্ভবত সহজতর। তবে এম্বেড থাকা সিস্টেমগুলির জন্য অবশ্যই একটি ভাল সমাধান।
aj.toulan


1

কেবলমাত্র আপনি এই স্নিপেট ব্যবহার করতে পারেন:

#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/


0

আকারের সাথে একসাথে টাইপটি ব্যবহার করা এড়িয়ে চলুন sizeof(array)/sizeof(char), হঠাৎ দূষিত হয়ে পড়লে আপনি অ্যারের ধরণটি পরিবর্তন করেন change

ভিজ্যুয়াল স্টুডিওতে আপনার সমতুল্য যদি থাকে sizeof(array)/sizeof(*array)। আপনি কেবল টাইপ করতে পারেন_countof(array)


0

আমি ব্যক্তিগতভাবে পরামর্শ দিই (আপনি যদি কোনও কারণেই বিশেষায়িত ফাংশন নিয়ে কাজ করতে না পারেন) প্রথমে অ্যারে টাইপের সামঞ্জস্যতাটি প্রসারিত করার জন্য যা আপনি সাধারণত এটি ব্যবহার করবেন (যদি আপনি মান st 0:

unsigned int x[] -> int x[]

আপনি অ্যারের 1 এলিমেন্টটি তৈরি করার চেয়ে বড় করে তুলুন। শেষ উপাদানটির জন্য আপনি কিছু প্রকার স্থাপন করবেন যা প্রসারিত প্রকারের নির্দিষ্টকরণকারীর অন্তর্ভুক্ত রয়েছে তবে আপনি সাধারণত ব্যবহার করবেন না উদাহরণস্বরূপ পূর্ববর্তী উদাহরণটি ব্যবহার করে শেষ উপাদানটি -১ হবে। এটি আপনাকে (লুপের জন্য ব্যবহার করে) একটি অ্যারের শেষ উপাদানটি সন্ধান করতে সক্ষম করে।


0

আপনি এটি সন্ধান করার সবচেয়ে সাধারণ কারণগুলির মধ্যে একটি হ'ল কারণ আপনি কোনও ফাংশনে অ্যারে পাস করতে চান এবং এর আকারের জন্য অন্য কোনও যুক্তি পাস করতে হবে না। আপনি সাধারণত অ্যারের আকারটি গতিশীল হতে চান। এই অ্যারেতে বস্তুগুলি থাকতে পারে, আদিম নয়, এবং বস্তুগুলি এমন আকারের আকার_ফ (()) গণনা গণনা করার জন্য একটি নিরাপদ বিকল্প নয়।

অন্যরা যেমন পরামর্শ দিয়েছে, আদিম অ্যারের পরিবর্তে স্টাডি :: ভেক্টর বা তালিকা ইত্যাদি ব্যবহার বিবেচনা করুন। পুরানো সংকলকগুলিতে, তবে এখনও আপনার চূড়ান্ত সমাধান সম্ভবত আপনি সম্ভবত এটি করেই করতে পারবেন না যদিও পাত্রে পপুলেশন করার জন্য একগুচ্ছ কুৎসিত পুশ_ব্যাক () লাইন প্রয়োজন। আপনি যদি আমার মতো হন তবে বেনামে জড়িত জিনিসগুলির সাথে একটি একক লাইন সমাধান চান।

আপনি যদি কোনও আদিম অ্যারের বিকল্পের সাথে এসটিএল কনটেইনার নিয়ে যান তবে এই এসও পোস্টটি এটি আরম্ভ করার উপায়গুলির জন্য আপনার কাজে লাগতে পারে: হার্ডকোডযুক্ত উপাদানগুলির সাথে একটি স্টাড :: ভেক্টর আরম্ভ করার সহজতম উপায় কী?

এখানে একটি পদ্ধতি যা আমি এর জন্য ব্যবহার করছি যা সংকলক এবং প্ল্যাটফর্ম জুড়ে সর্বজনীনভাবে কাজ করবে:

আপনার অবজেক্টস সংগ্রহের জন্য ধারক হিসাবে একটি কাঠামো বা শ্রেণি তৈরি করুন। << জন্য অপারেটর ওভারলোড ফাংশনটি সংজ্ঞায়িত করুন।

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) );

এইভাবে, আপনি একটি একক পরিষ্কার লাইনে কোনও ক্রিয়াকলাপে গতিশীল আকারের অবজেক্টগুলি সংগ্রহ এবং পাস করতে পারেন!


-4

আপনাকে পৃষ্ঠার শীর্ষে ঘোষিত বিশ্বব্যাপী অ্যারে বলতে দেয়

int global[] = { 1, 2, 3, 4 };

অ্যারেতে কতগুলি উপাদান রয়েছে (সি ++ এ) নীচের কোডটি টাইপ করুন:

sizeof(global) / 4;

আকার (NAME_OF_ARRAY) / 4 আপনাকে প্রদত্ত অ্যারে নামের জন্য উপাদানগুলির সংখ্যা ফিরিয়ে দেবে।


8
মাপ (ইনট) প্ল্যাটফর্ম নির্ভর। এটি 4 হবে এমন কোনও গ্যারান্টি নেই (যদিও এটি সর্বাধিক সাধারণ ঘটনা)
বিজয়ী

সংযোজনের জন্য আপনার চেয়ে বেশি
মিক্সেইআই

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