আপনি যে পদ্ধতির বর্ণনা করেছেন সেটি কেবল সি ++ এর সাথেই নয়, এর (বেশিরভাগ) উপসেট ভাষা সি এর সাথেও উপযুক্ত । সি-স্টাইলের লিঙ্কযুক্ত-তালিকা বিকাশ করা শিখাইয়া নিচু স্তরের প্রোগ্রামিং কৌশলগুলির (যেমন ম্যানুয়াল মেমরি ম্যানেজমেন্ট) এর সাথে নিজেকে পরিচয় করানোর একটি ভাল উপায়, তবে এটি সাধারণত হয় না আধুনিক সি ++ বিকাশের জন্য সেরা-অনুশীলন ।
নীচে, আমি সি ++ এ আইটেমের তালিকা কীভাবে পরিচালনা করতে পারি তার চারটি পরিবর্তন বাস্তবায়িত করেছি।
raw_pointer_demo
আপনার মত একই পদ্ধতির ব্যবহার করে - কাঁচা পয়েন্টার ব্যবহারের সাথে ম্যানুয়াল মেমরি পরিচালনা প্রয়োজন। এখানে সি ++ ব্যবহার কেবল সিনট্যাকটিক-চিনির জন্য for , এবং ব্যবহৃত পদ্ধতির অন্যথায় সি ভাষার সাথে সামঞ্জস্যপূর্ণ।
- ইন
shared_pointer_demo
তালিকা ব্যবস্থাপনা এখনও ম্যানুয়ালি সম্পন্ন করা হয়, কিন্তু মেমরি ব্যবস্থাপনা হয় স্বয়ংক্রিয় (কাঁচা পয়েন্টার ব্যবহার করে না)। এটি সম্ভবত আপনি জাভা দিয়ে যা अनुभव করেছেন তার সাথে খুব মিল।
std_list_demo
স্ট্যান্ডার্ড-লাইব্রেরি list
পাত্রে ব্যবহার করে । এটি যদি আপনি নিজের রোলিংয়ের পরিবর্তে বিদ্যমান লাইব্রেরিগুলিতে নির্ভর করেন তবে জিনিসগুলি কত সহজ হয় তা দেখায়।
std_vector_demo
স্ট্যান্ডার্ড-লাইব্রেরি vector
পাত্রে ব্যবহার করে । এটি একটি একক সঙ্গতিপূর্ণ মেমরি বরাদ্দে তালিকার সঞ্চয়স্থান পরিচালনা করে। অন্য কথায়, পৃথক উপাদানগুলিতে পয়েন্টার নেই। কিছু নির্দিষ্ট বরং চরম ক্ষেত্রে, এটি উল্লেখযোগ্যভাবে অদক্ষ হয়ে উঠতে পারে। সাধারণ ক্ষেত্রে, তবে এটি সি ++ এ তালিকা পরিচালনার জন্য প্রস্তাবিত সেরা অনুশীলন ।
দ্রষ্টব্য: এই সমস্তগুলির মধ্যে, কেবলমাত্র raw_pointer_demo
"ফাঁস" মেমরি এড়াতে কেবল তালিকাটি স্পষ্টভাবে ধ্বংস করা দরকার। অন্য তিনটি পদ্ধতি স্বয়ংক্রিয়ভাবে তালিকাটি এবং এর বিষয়বস্তুগুলি নষ্ট করে দিবে যখন ধারকটি সুযোগের বাইরে চলে যায় (ফাংশনের সমাপ্তিতে)। বিষয়টি হ'ল: সি ++ এই ক্ষেত্রে খুব "জাভা-জাতীয়" হতে সক্ষম - তবে আপনি যদি কেবলমাত্র আপনার নিষ্পত্তি করার ক্ষেত্রে উচ্চ-স্তরের সরঞ্জামগুলি ব্যবহার করে আপনার প্রোগ্রামটি বিকাশ করতে চান তবেই।
/*BINFMTCXX: -Wall -Werror -std=c++11
*/
#include <iostream>
#include <algorithm>
#include <string>
#include <list>
#include <vector>
#include <memory>
using std::cerr;
/** Brief Create a list, show it, then destroy it */
void raw_pointer_demo()
{
cerr << "\n" << "raw_pointer_demo()..." << "\n";
struct Node
{
Node(int data, Node *next) : data(data), next(next) {}
int data;
Node *next;
};
Node * items = 0;
items = new Node(1,items);
items = new Node(7,items);
items = new Node(3,items);
items = new Node(9,items);
for (Node *i = items; i != 0; i = i->next)
cerr << (i==items?"":", ") << i->data;
cerr << "\n";
// Erase the entire list
while (items) {
Node *temp = items;
items = items->next;
delete temp;
}
}
raw_pointer_demo()...
9, 3, 7, 1
/** Brief Create a list, show it, then destroy it */
void shared_pointer_demo()
{
cerr << "\n" << "shared_pointer_demo()..." << "\n";
struct Node; // Forward declaration of 'Node' required for typedef
typedef std::shared_ptr<Node> Node_reference;
struct Node
{
Node(int data, std::shared_ptr<Node> next ) : data(data), next(next) {}
int data;
Node_reference next;
};
Node_reference items = 0;
items.reset( new Node(1,items) );
items.reset( new Node(7,items) );
items.reset( new Node(3,items) );
items.reset( new Node(9,items) );
for (Node_reference i = items; i != 0; i = i->next)
cerr << (i==items?"":", ") << i->data;
cerr<<"\n";
// Erase the entire list
while (items)
items = items->next;
}
shared_pointer_demo()...
9, 3, 7, 1
/** Brief Show the contents of a standard container */
template< typename C >
void show(std::string const & msg, C const & container)
{
cerr << msg;
bool first = true;
for ( int i : container )
cerr << (first?" ":", ") << i, first = false;
cerr<<"\n";
}
/** Brief Create a list, manipulate it, then destroy it */
void std_list_demo()
{
cerr << "\n" << "std_list_demo()..." << "\n";
// Initial list of integers
std::list<int> items = { 9, 3, 7, 1 };
show( "A: ", items );
// Insert '8' before '3'
items.insert(std::find( items.begin(), items.end(), 3), 8);
show("B: ", items);
// Sort the list
items.sort();
show( "C: ", items);
// Erase '7'
items.erase(std::find(items.begin(), items.end(), 7));
show("D: ", items);
// Erase the entire list
items.clear();
show("E: ", items);
}
std_list_demo()...
A: 9, 3, 7, 1
B: 9, 8, 3, 7, 1
C: 1, 3, 7, 8, 9
D: 1, 3, 8, 9
E:
/** brief Create a list, manipulate it, then destroy it */
void std_vector_demo()
{
cerr << "\n" << "std_vector_demo()..." << "\n";
// Initial list of integers
std::vector<int> items = { 9, 3, 7, 1 };
show( "A: ", items );
// Insert '8' before '3'
items.insert(std::find(items.begin(), items.end(), 3), 8);
show( "B: ", items );
// Sort the list
sort(items.begin(), items.end());
show("C: ", items);
// Erase '7'
items.erase( std::find( items.begin(), items.end(), 7 ) );
show("D: ", items);
// Erase the entire list
items.clear();
show("E: ", items);
}
std_vector_demo()...
A: 9, 3, 7, 1
B: 9, 8, 3, 7, 1
C: 1, 3, 7, 8, 9
D: 1, 3, 8, 9
E:
int main()
{
raw_pointer_demo();
shared_pointer_demo();
std_list_demo();
std_vector_demo();
}