Pendekatan yang Anda gambarkan tidak hanya kompatibel dengan C ++, tetapi juga dengan (kebanyakan) bahasa subset C-nya . Mempelajari cara mengembangkan daftar-tertaut gaya-C adalah cara yang baik untuk memperkenalkan diri Anda pada teknik pemrograman tingkat rendah (seperti manajemen memori manual), tetapi secara umum ini bukan praktik terbaik untuk pengembangan C ++ modern.
Di bawah ini, saya telah menerapkan empat variasi tentang cara mengelola daftar item di C ++.
raw_pointer_demo
menggunakan pendekatan yang sama seperti milik Anda - manajemen memori manual diperlukan dengan penggunaan pointer mentah. Penggunaan C ++ di sini hanya untuk gula sintaksis , dan pendekatan yang digunakan kompatibel dengan bahasa C.
- Dalam
shared_pointer_demo
pengelolaan daftar masih dilakukan secara manual, namun pengelolaan memori dilakukan secara otomatis (tidak menggunakan raw pointer). Ini sangat mirip dengan apa yang mungkin Anda alami dengan Java.
std_list_demo
menggunakan list
wadah pustaka standar . Ini menunjukkan betapa lebih mudahnya hal-hal jika Anda mengandalkan pustaka yang ada daripada menggulirkan milik Anda sendiri.
std_vector_demo
menggunakan vector
wadah pustaka standar . Ini mengelola penyimpanan daftar dalam satu alokasi memori yang berdekatan. Dengan kata lain, tidak ada petunjuk ke elemen individu. Untuk kasus tertentu yang agak ekstrem, ini mungkin menjadi sangat tidak efisien. Namun, untuk kasus umum, ini adalah praktik terbaik yang direkomendasikan untuk pengelolaan daftar di C ++ .
Catatan: Dari semua ini, hanya yang raw_pointer_demo
benar - benar mengharuskan daftar tersebut dihancurkan secara eksplisit untuk menghindari memori "bocor". Tiga metode lainnya akan secara otomatis menghancurkan daftar dan isinya ketika wadah keluar dari ruang lingkup (di akhir fungsi). Intinya adalah: C ++ mampu menjadi sangat "mirip Java" dalam hal ini - tetapi hanya jika Anda memilih untuk mengembangkan program menggunakan alat tingkat tinggi yang Anda inginkan.
/*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();
}