आपके द्वारा वर्णित दृष्टिकोण न केवल C ++ के साथ, बल्कि इसके (ज्यादातर) सबसेट भाषा C के साथ भी संगत है । सी-स्टाइल से जुड़ी-सूची विकसित करना सीखना अपने आप को निम्न-स्तरीय प्रोग्रामिंग तकनीकों (जैसे मैनुअल मेमोरी मैनेजमेंट) से परिचित कराने का एक अच्छा तरीका है, लेकिन यह आमतौर पर आधुनिक C ++ विकास के लिए सबसे अच्छा अभ्यास नहीं है।
नीचे, मैंने C ++ में आइटमों की सूची का प्रबंधन करने के तरीके पर चार बदलाव किए हैं।
raw_pointer_demo
आपके जैसे ही दृष्टिकोण का उपयोग करता है - कच्चे पॉइंटर्स के उपयोग के लिए आवश्यक मैनुअल मेमोरी प्रबंधन। यहाँ C ++ का उपयोग केवल वाक्यात्मक-चीनी के लिए है , और उपयोग किया जाने वाला दृष्टिकोण अन्यथा C भाषा के अनुकूल है।
- में
shared_pointer_demo
सूची प्रबंधन अभी भी मैन्युअल रूप से किया जाता है, लेकिन स्मृति प्रबंधन है स्वत: (कच्चे संकेत का उपयोग नहीं करता)। यह बहुत कुछ वैसा ही है जैसा आपने शायद जावा के साथ अनुभव किया है।
std_list_demo
मानक-पुस्तकालय list
कंटेनर का उपयोग करता है । इससे पता चलता है कि यदि आप स्वयं को रोल करने के बजाय मौजूदा पुस्तकालयों पर भरोसा करते हैं तो चीजें कितनी आसान हो जाती हैं।
std_vector_demo
मानक-पुस्तकालय vector
कंटेनर का उपयोग करता है । यह सूची संग्रह को एक एकल सन्निहित स्मृति आवंटन में प्रबंधित करता है। दूसरे शब्दों में, अलग-अलग तत्वों के संकेत नहीं हैं। कुछ खास चरम मामलों के लिए, यह काफी अक्षम हो सकता है। हालांकि, विशिष्ट मामलों के लिए, यह C ++ में सूची प्रबंधन के लिए अनुशंसित सर्वोत्तम अभ्यास है ।
ध्यान दें: इन सभी में, केवल raw_pointer_demo
वास्तव में आवश्यकता है कि "लीक" मेमोरी से बचने के लिए सूची को स्पष्ट रूप से नष्ट कर दिया जाए। अन्य तीन विधियाँ स्वचालित रूप से सूची और उसकी सामग्री को तब नष्ट कर देंगी जब कंटेनर कार्यक्षेत्र से बाहर हो जाएगा (फ़ंक्शन के समापन पर)। बिंदु जा रहा है: C ++ इस संबंध में बहुत "जावा-जैसा" होने में सक्षम है - लेकिन केवल तभी जब आप अपने निपटान में उच्च-स्तरीय टूल का उपयोग करके अपने प्रोग्राम को विकसित करना चुनते हैं।
/*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();
}