আপনার প্রশ্নের জবাব বিশুদ্ধভাবে, আপনি একটি পুনরাবৃত্তি ব্যবহার করতে পারেন:
std::vector<char> path;
// ...
for (std::vector<char>::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
আপনি যদি লুপের জন্য ভেক্টরের সামগ্রীগুলি পরিবর্তন করতে চান তবে তার iterator
পরিবর্তে ব্যবহার করুন const_iterator
।
তবে এ সম্পর্কে আরও অনেক কিছু বলা যায়। আপনি যদি কেবল উত্তরটি ব্যবহার করতে পারেন তবে আপনি এখানে থামতে পারেন; অন্যথায়, পড়ুন।
অটো (সি ++ 11) / টাইপডেফ
এটি অন্য কোনও সমাধান নয়, তবে উপরের iterator
সমাধানটির পরিপূরক । আপনি যদি সি ++ 11 স্ট্যান্ডার্ড (বা তারপরে) ব্যবহার করেন তবে আপনি auto
পাঠযোগ্যতার সাহায্যে কীওয়ার্ডটি ব্যবহার করতে পারেন :
for (auto i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
তবে এর i
ধরণটি অবিচ্ছিন্ন হবে (যেমন, সংকলক std::vector<char>::iterator
প্রকার হিসাবে ব্যবহার করবে i
)।
এই ক্ষেত্রে, আপনি কেবল একটি typedef
(সি ++ 11 এর মধ্যে সীমাবদ্ধ নয় এবং যাইহোক ব্যবহারের জন্য খুব দরকারী) ব্যবহার করতে পারেন:
typedef std::vector<char> Path;
Path path;
// ...
for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
std::cout << *i << ' ';
বিপরীত
লুপটিতে নিজের অবস্থানটি রেকর্ড করতে আপনি অবশ্যই একটি পূর্ণসংখ্যার প্রকারটি ব্যবহার করতে পারেন for
:
for(int i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
আপনি যদি এটি করতে যাচ্ছেন তবে ধারকটির সদস্য প্রকারগুলি উপলব্ধ এবং উপযুক্ত হলে এটি ব্যবহার করা ভাল। এই কাজের জন্য std::vector
ডাকা একটি সদস্য প্রকার আছে size_type
: এটি size
পদ্ধতি দ্বারা ফিরে আসা টাইপ ।
// Path typedef'd to std::vector<char>
for( Path::size_type i=0; i<path.size(); ++i)
std::cout << path[i] << ' ';
iterator
সমাধানের উপরে কেন এটি ব্যবহার করবেন না ? সাধারণ ক্ষেত্রে আপনার পক্ষেও হতে পারে তবে মূল বিষয়টি হ'ল iterator
শ্রেণি এমন একটি বিষয় যা আরও জটিল জটিল বস্তুগুলির জন্য এই কাজটি করার জন্য ডিজাইন করা হয়েছে যেখানে এই সমাধানটি আদর্শ হতে চলেছে না।
লুপের জন্য পরিসীমা ভিত্তিক (সি ++ 11)
দেখুন Jefffrey এর সমাধান । সি ++ 11 এ (এবং তারপরে) আপনি নতুন পরিসীমা-ভিত্তিক for
লুপটি ব্যবহার করতে পারেন , যা দেখতে এটির মতো দেখাচ্ছে:
for (auto i: path)
std::cout << i << ' ';
যেহেতু path
আইটেমগুলির ভেক্টর (স্পষ্টভাবে std::vector<char>
), বস্তুটি i
ভেক্টরের আইটেমের ধরণের (যেমন, স্পষ্টতই, এটি ধরণের char
)। অবজেক্টটির i
একটি মান রয়েছে যা path
বস্তুর আসল আইটেমের অনুলিপি । সুতরাং, i
লুপের সমস্ত পরিবর্তনগুলি নিজের মধ্যে সংরক্ষণ করা হয় না path
। উপরন্তু, যদি আপনি সত্য যে তোমাদের মধ্যে কপি মান পরিবর্তন পাবে না চান জোরদার করা চাই i
লুপ, আপনি ধরণ জোর করতে পারেন i
হতে const char
ভালো:
for (const auto i: path)
std::cout << i << ' ';
আপনি যদি আইটেমগুলিতে পরিবর্তন করতে চান তবে আপনি path
একটি রেফারেন্স ব্যবহার করতে পারেন:
for (auto& i: path)
std::cout << i << ' ';
এবং আপনি যদি সংশোধন করতে না চান, এমনকি যদি path
অবজেক্টগুলির অনুলিপি ব্যয়বহুল হয় তবে আপনার মান দ্বারা অনুলিপি না করে কনস্ট রেফারেন্স ব্যবহার করা উচিত:
for (const auto& i: path)
std::cout << i << ' ';
এসটিডি :: কপি
দেখুন যিহোশূয়ের উত্তর । std::copy
আউটপুট স্ট্রিমে ভেক্টরের সামগ্রীগুলি অনুলিপি করতে আপনি এসটিএল অ্যালগরিদম ব্যবহার করতে পারেন । এটি যদি আপনি এটির সাথে স্বাচ্ছন্দ্য বোধ করেন তবে এটি একটি মার্জিত সমাধান (এবং কেবল এটি কোনও ভেক্টরের সামগ্রীগুলি মুদ্রণের ক্ষেত্রে নয়) এটি খুব দরকারী।
এসটিডি :: for_each
দেখুন ম্যাক্স এর সমাধান । ব্যবহার std::for_each
করা এই সাধারণ দৃশ্যের জন্য ওভারকিল, তবে আপনি কেবল স্ক্রিনে প্রিন্টিংয়ের চেয়ে আরও কিছু করতে চাইলে এটি একটি খুব কার্যকর সমাধান: ব্যবহার করে std::for_each
আপনাকে ভেক্টর সামগ্রীগুলিতে কোনও (বুদ্ধিমান) অপারেশন করতে দেয়।
ওভারলোড ostream :: অপারেটর <<
দেখুন ক্রিস এর উত্তর , এই আরো অন্যান্য উত্তর যেহেতু আপনি এখনও ওভারলোডিং উপরে সমাধান এক বাস্তবায়ন প্রয়োজন হবে একটি পরিপূরক। তার উদাহরণে তিনি একটি for
লুপে একটি কাউন্টার ব্যবহার করেছিলেন । উদাহরণস্বরূপ, আপনি এইভাবে জোশুয়ার সমাধান দ্রুত ব্যবহার করতে পারেন :
template <typename T>
std::ostream& operator<< (std::ostream& out, const std::vector<T>& v) {
if ( !v.empty() ) {
out << '[';
std::copy (v.begin(), v.end(), std::ostream_iterator<T>(out, ", "));
out << "\b\b]";
}
return out;
}
অন্য যে কোনও সমাধানের ব্যবহার সোজা হওয়া উচিত।
উপসংহার
এখানে উপস্থাপিত যে কোনও সমাধান কাজ করবে। এটি আপনার এবং কোডটির উপর নির্ভর করে যেটি "সেরা"। এর থেকে আরও বিশদযুক্ত যে কোনও বিষয় সম্ভবত অন্য কোনও প্রশ্নের জন্য সবচেয়ে ভাল বাকি আছে যেখানে উপকার / বিবেকের যথাযথ মূল্যায়ন করা যেতে পারে; তবে সর্বদা হিসাবে ব্যবহারকারীর পছন্দ সর্বদা একটি ভূমিকা পালন করবে: উপস্থাপিত সমাধানগুলির কোনওটিই ভুল নয়, তবে কিছু প্রতিটি স্বতন্ত্র কোডারের কাছে আরও ভাল লাগবে।
অভিযোজ্য বস্তু
এটি আমি পোস্ট করা আগেরটির একটি বর্ধিত সমাধান। যেহেতু সেই পোস্টটি মনোযোগ পাচ্ছে, তাই আমি এটিকে প্রসারিত করার এবং এখানে পোস্ট করা অন্যান্য দুর্দান্ত সমাধানগুলি উল্লেখ করার সিদ্ধান্ত নিয়েছি। আমার মূল পোস্ট মন্তব্য যে উল্লেখ করেন যে, যদি আপনি ছিল সেটা একটি ভিতরে আপনার ভেক্টর পরিবর্তন উপর ইচ্ছুক for
লুপ তারপর দ্বারা উপলব্ধ দুটি পদ্ধতি আছে std::vector
: এক্সেস উপাদান std::vector::operator[]
যা সীমা চেক করে না, এবং std::vector::at
সীমা চেক সঞ্চালন অবলম্বন দিতে হবে। অন্য কথায়, at
যদি আপনি ভেক্টরের বাইরে কোনও উপাদান অ্যাক্সেস করার চেষ্টা করেন তবে নিক্ষেপ operator[]
করবেন। আমি কেবল এই মন্তব্যটি যুক্ত করেছি, মূলত এমন কিছু উল্লেখ করার জন্য যা ইতিমধ্যে কেউ না জানলে এটি দরকারী হতে পারে। এবং আমি এখন কোন পার্থক্য দেখতে পাচ্ছি। অতএব এই সংযোজন।