কীভাবে তালিকায় একটি নির্দিষ্ট উপাদান পাবেন?


97

সুতরাং আমি একটি তালিকা পেয়েছি:

list<Object> myList;
myList.push_back(Object myObject);

আমি নিশ্চিত নই তবে আমি আত্মবিশ্বাসী যে এটি অ্যারেতে "0 তম" উপাদান হবে। আমি কি এমন কোনও ফাংশন ব্যবহার করতে পারি যা "মাইবজেক্ট" ফিরিয়ে দেবে?

Object copy = myList.find_element(0);

?


8
কোনও অ্যারে নেই - এটি একটি তালিকা। আপনি যদি পূর্ণসংখ্যার সাহায্যে সূচী করতে চান তবে আপনি vectorপরিবর্তে কেন ব্যবহার করবেন না ?
পল জে লুকাস

4
আপনি যদি সর্বদা 0 উপাদান চান তবে ব্যবহার করুন front()
পল জে লুকাস

আমি এটি পরীক্ষা করেছি না, তবে আমি ধরে নিয়েছি আমার লিস্ট.ফ্রন্ট () + নাম এখানে কাজ করবে
সের্গেই ফেদোরভ

4
@ সের্গেইয়ে ফেদোরভ: না, তা হয় না
আলগোমন

উত্তর:


133

আপনার যদি ঘন ঘন কোনও অনুক্রমের Nth উপাদানটি অ্যাক্সেস করার প্রয়োজন হয় std::list, যা দ্বিগুণ লিঙ্কযুক্ত তালিকা হিসাবে প্রয়োগ করা হয় তবে সম্ভবত সঠিক পছন্দ নয়। std::vectorবা std::dequeসম্ভবত আরও ভাল হবে।

এটি বলেছিল, আপনি Nth উপাদানটি ব্যবহার করে একটি পুনরাবৃত্তি পেতে পারেন std::advance:

std::list<Object> l;
// add elements to list 'l'...

unsigned N = /* index of the element you want to retrieve */;
if (l.size() > N)
{
    std::list<Object>::iterator it = l.begin();
    std::advance(it, N);
    // 'it' points to the element at index 'N'
}

একটি ধারক যে রেণ্ডম এক্সেস উপলব্ধ করা হয় না জন্য, মত std::list, std::advanceকল operator++পুনরুক্তিকারীর উপর Nবার। বিকল্পভাবে, যদি আপনার স্ট্যান্ডার্ড লাইব্রেরি বাস্তবায়ন এটি সরবরাহ করে তবে আপনি কল করতে পারেন std::next:

if (l.size() > N)
{
    std::list<Object>::iterator it = std::next(l.begin(), N);
}

std::nextকার্যকরভাবে একটি কলকে মোড়ানো হয় std::advance, Nকোডের কম লাইন এবং আরও কম পরিবর্তনীয় ভেরিয়েবলের সাহায্যে একটি পুনরাবৃত্তির সময়ের অগ্রগতি সহজ করে তোলে । std::nextসি ++ 11 এ যুক্ত হয়েছিল।


18
আপনি এলোমেলো অ্যাক্সেসের অভাবে কোনও লিঙ্কযুক্ত তালিকার সন্ধানের জন্য পারফরম্যান্স পেনাল্টি প্রদান করার সময়, যদি আপনার কোনও ভেক্টর বা ডিকের মাঝে ডেটা orোকাতে বা মুছতে হয় তবে আপনি অনেক বড় পারফরম্যান্স জরিমানা প্রদান করেন। তারা যদি তাদের উদ্দেশ্যগুলির জন্য আদর্শ ধারক ব্যবহার করে তবে এই সিদ্ধান্তে আসলে পর্যাপ্ত তথ্য থাকে না।
স্নাতক

4
এটি লক্ষ করার মতো যে ইউজটি ব্যবহার করার সময় std::advanceবা std::nextএটি সহজ হয় B কোনও বাউন্ড চেকিং নেই।
Okovko

34

std::listকোনও সূচক দেওয়া উপাদান পেতে কোনও ফাংশন সরবরাহ করে না। আপনি কিছু কোড লিখে এটি পাওয়ার চেষ্টা করতে পারেন, যা আমি প্রস্তাবনা করব না, কারণ আপনার যদি প্রায়শই এটির প্রয়োজন হয় তবে তা অকার্যকর হবে।

আপনার কি কি প্রয়োজন হয়: std::vector। এটি হিসাবে ব্যবহার করুন:

std::vector<Object> objects;
objects.push_back(myObject);

Object const & x = objects[0];    //index isn't checked
Object const & y = objects.at(0); //index is checked 

7
std::list<Object> l; 
std::list<Object>::iterator ptr;
int i;

for( i = 0 , ptr = l.begin() ; i < N && ptr != l.end() ; i++ , ptr++ );

if( ptr == l.end() ) {
    // list too short  
} else {
    // 'ptr' points to N-th element of list
}

3

সবচেয়ে কার্যকর উপায় না। তবে আপনি তালিকাটি ভেক্টরে রূপান্তর করতে পারেন।

#include <list>
#include <vector>

list<Object> myList;

vector<Object> myVector(myList.begin(), myList.end());

তারপরে [x] অপারেটরটি ব্যবহার করে ভেক্টরটি অ্যাক্সেস করুন।

auto x = MyVector[0];

আপনি এটি একটি সহায়ক ফাংশনে রাখতে পারেন:

#include <memory>
#include <vector>
#include <list>

template<class T>
shared_ptr<vector<T>> 
ListToVector(list<T> List) {
shared_ptr<vector<T>> Vector {
        new vector<string>(List.begin(), List.end()) }
return Vector;
}

তারপরে হেল্পার ফানসিটনটি এটির মতো ব্যবহার করুন:

auto MyVector = ListToVector(Object);
auto x = MyVector[0];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.