c++ - স্ট্রিংয়ের জন্য set_union ব্যবহার করে




algorithm sorting (2)

আমার দুটি ভেক্টর রয়েছে, আমার তৃতীয় ভেক্টরে তাদের ইউনিয়ন প্রয়োজন (তৃতীয় ভেক্টরের আকার নির্দিষ্ট না করে)

std::vector<std::string> a = {"a","b"};
std::vector<std::string> b = {"d","c"};

std::vector<std::string> c;

std::set_union(a.begin(),a.end(),b.begin(),b.end(),c.begin());
std::cout<<c[1];

এটি কম্পাইল করে তবে একটি খালি আউটপুট দেয়।


অ্যালগরিদম std::set_union দরকার। আপনার স্ট্রিংয়ের উদাহরণে প্রথম ভেক্টরকে আরোহী ক্রমে এবং দ্বিতীয়টিতে - উতরিত ক্রমে অর্ডার দেওয়া হয়।

তাছাড়া ভেক্টর c খালি তাই আপনি অ্যালগরিদমের ডাকে c.begin() এক্সপ্রেশনটি ব্যবহার করতে পারবেন না। আপনার std::back_insert_iterator ব্যবহার করা দরকার।

আপনার স্ট্রিংয়ের উদাহরণের জন্য অ্যালগরিদমের কলটি নিখুঁতভাবে দেখতে পারে যেমন এটি বিক্ষোভকারী প্রোগ্রামে প্রদর্শিত হয়।

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>


int main() 
{
    std::vector<std::string> a = { "a", "b" };
    std::vector<std::string> b = { "d", "c" };

    std::vector<std::string> c;

    std::set_union( std::begin( a ), std::end( a ), 
                    std::rbegin( b ), std::rend( b ),
                    std::back_inserter( c ) );

    for ( const auto &s : c ) std::cout << s << ' ';
    std::cout << '\n';

    return 0;
}

এর আউটপুট হয়

a b c d 

অন্যথায় আপনার ভেক্টর বাছাই করা প্রয়োজন।

আপনি যদি মূল ভেক্টরগুলিকে বাছাই না করে থাকেন তবে নীচের পদ্ধতিটি ব্যবহার করতে পারেন

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>


int main() 
{
    std::vector<std::string> a = { "a", "b" };
    std::vector<std::string> b = { "d", "c", "a" };

    std::vector<std::string> c( a );
    c.insert( std::end( c ), std::begin( b ), std::end( b ) );

    std::sort( std::begin( c ), std::end( c ) );

    c.erase( std::unique( std::begin( c ), std::end( c ) ), std::end( c ) );

    for ( const auto &s : c ) std::cout << s << ' ';
    std::cout << '\n';

    return 0;
}

প্রোগ্রাম আউটপুট হয়

a b c d

আপনার কোডে দুটি জিনিস ভুল:

  1. আপনি std::set_union এর প্রয়োজনীয়তাগুলি পড়েন std::set_union - প্রদত্ত তুলনা ফাংশন অনুযায়ী ইনপুট রেঞ্জগুলি বাছাই করতে হবে (আপনার ক্ষেত্রে operator< আপনার ক্ষেত্রে) - এটি std::set_union জন্য ধারণ করে না।
  2. অ্যালগরিদম c.begin() মাধ্যমে c.begin() আকার পরিবর্তন করতে পারে না; এটি খালি থাকে এবং আপনি সীমা ছাড়াই লিখেন। std::back_insert_iterator ব্যবহার করুন।




stl