কীভাবে একটি তালিকা সংযোজন করতে হবে <T> অন্যটির সাথে আপত্তি করুন


94

সি ++ এ আমার দুটি list<T>অবজেক্ট রয়েছে Aএবং Bআমি Bএর শেষে সমস্ত সদস্যকে যুক্ত করতে চাই A। আমি কয়েকটি ভিন্ন উত্স অনুসন্ধান করেছি এবং একটি সহজ সমাধান (ই A.append(B);) খুঁজে পাইনি এবং এটি আমাকে খানিকটা অবাক করে দিয়েছে।

এই কাজ করতে সবচেয়ে ভালো উপায় কি?

এটি যেমন ঘটে থাকে, আমি এর পরে বি সম্পর্কে তেমন যত্ন নিই না (এটি পরের লাইনে মুছে ফেলা হবে) সুতরাং যদি আরও ভাল পারফরম্যান্সের জন্য যদি কোনও উপায় অবলম্বন করার উপায় থাকে তবে আমি এতেও আগ্রহী।

উত্তর:


195

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

a.insert(a.end(), b.begin(), b.end());

আপনি যদি বি এর আইটেমগুলিকে এ এর শেষে (একই সময়ে বি খালি করতে) সরাতে চান তবে আপনি এটি করতে পারেন:

a.splice(a.end(), b);

আপনার পরিস্থিতিতে বিভক্ত হওয়া আরও ভাল হবে, কারণ এটিতে লিঙ্কযুক্ত তালিকার মধ্যে কয়েকটি পয়েন্টার সামঞ্জস্য করা।


8
+1 তাই ডান. মানচিত্র এবং সেটগুলি "টুকরো টুকরো" করা যদি এত সহজ এবং দক্ষ হতে পারত ...
প্যারেসবাল

এই অপারেশনগুলি হয় ও (1)?
ক্রিস রেডফোর্ড

4
আমার ধারণা স্প্লাইস উপরের কেসের জন্য ও (1) হওয়া উচিত।
chunkyguy

9
এটি ও (1) এর জন্য a.splice(a.end(), b)এবং a.splice(a.end(), b, it_b_start)তবে ও (এন) এর জন্য a.splice(a.end(), b, it_b_start, it_b_end)
hkBattousai

10
কেন, ও কেন, এসটিএল কেবল a.append (খ) কে সমর্থন করতে পারে না?
21

-3

বুস্ট ব্যবহার করে একটি উদাহরণ

std::list<T> A; // object A is a list containing T structure
std::list<T> B; // object B is a list containing T structure

// append list B to list A
BOOST_FOREACH(auto &listElement, B) { A.push_back( listElement ); }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.