আপনি যদি অপারেটর ওভারলোডিং পছন্দ করেন তবে এখানে তিনটি সম্ভাবনা রয়েছে। প্রথম দুটি যথাক্রমে পুনরাবৃত্তকারী হিসাবে std::pair<>
এবং ব্যবহার করছে std::tuple<>
; তৃতীয়টি এটি পরিসীমা ভিত্তিক প্রসারিত করে for
। নোট করুন যে অপারেটরগুলির এই সংজ্ঞাগুলি সবাই পছন্দ করবে না তাই তাদের আলাদা আলাদা নেমস্পেসে using namespace
রেখে ফাংশনগুলিতে (ফাইল নয়!) রাখা ভাল যেখানে আপনি এইগুলি ব্যবহার করতে চান।
#include <iostream>
#include <utility>
#include <vector>
#include <tuple>
namespace pair_iterators
{
template<typename T1, typename T2>
std::pair<T1, T2> operator++(std::pair<T1, T2>& it)
{
++it.first;
++it.second;
return it;
}
}
namespace tuple_iterators
{
template<typename T1, typename T2, typename T3>
auto operator++(std::tuple<T1, T2, T3>& it)
{
++( std::get<0>( it ) );
++( std::get<1>( it ) );
++( std::get<2>( it ) );
return it;
}
template<typename T1, typename T2, typename T3>
auto operator*(const std::tuple<T1, T2, T3>& it)
{
return std::tie( *( std::get<0>( it ) ),
*( std::get<1>( it ) ),
*( std::get<2>( it ) ) );
}
template<typename... Args>
struct tuple_c
{
std::tuple<Args...> containers;
};
template<typename... Args>
auto tie_c( const Args&... args )
{
tuple_c<Args...> ret = { std::tie(args...) };
return ret;
}
template<typename T1, typename T2, typename T3>
auto begin( const tuple_c<T1, T2, T3>& c )
{
return std::make_tuple( std::get<0>( c.containers ).begin(),
std::get<1>( c.containers ).begin(),
std::get<2>( c.containers ).begin() );
}
template<typename T1, typename T2, typename T3>
auto end( const tuple_c<T1, T2, T3>& c )
{
return std::make_tuple( std::get<0>( c.containers ).end(),
std::get<1>( c.containers ).end(),
std::get<2>( c.containers ).end() );
}
}
int main()
{
using namespace pair_iterators;
using namespace tuple_iterators;
std::vector<double> ds = { 0.0, 0.1, 0.2 };
std::vector<int > is = { 1, 2, 3 };
std::vector<char > cs = { 'a', 'b', 'c' };
for( auto its = std::make_pair(ds.begin(), is.begin()),
end = std::make_pair(ds.end(), is.end() ); its != end; ++its )
{
std::cout << "1. " << *(its.first ) + *(its.second) << " " << std::endl;
}
for( auto its = std::make_tuple(ds.begin(), is.begin(), cs.begin()),
end = std::make_tuple(ds.end(), is.end(), cs.end() ); its != end; ++its )
{
std::cout << "2. " << *(std::get<0>(its)) + *(std::get<1>(its)) << " "
<< *(std::get<2>(its)) << " " << std::endl;
}
for( const auto& d_i_c : tie_c( ds, is, cs ) )
{
std::cout << "3. " << std::get<0>(d_i_c) + std::get<1>(d_i_c) << " "
<< std::get<2>(d_i_c) << " " << std::endl;
}
}
for
কেবলমাত্র একটি ভেরিয়েবলের সাথে ব্যবহার করা যেতে পারে, তাই না। আপনি যদি একবারে দুটি মান অ্যাক্সেস করতে চান তবে আপনাকে এমন কিছু ব্যবহার করতে হবেstd::pair