আপনি যদি অপারেটর ওভারলোডিং পছন্দ করেন তবে এখানে তিনটি সম্ভাবনা রয়েছে। প্রথম দুটি যথাক্রমে পুনরাবৃত্তকারী হিসাবে 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