Tanımladığınız yaklaşım yalnızca C ++ ile değil, aynı zamanda (çoğunlukla) alt küme dili C ile de uyumludur . C tarzı bir bağlantılı liste geliştirmeyi öğrenmek, kendinizi düşük düzeyli programlama tekniklerine (manuel bellek yönetimi gibi) tanıtmanın iyi bir yoludur, ancak genellikle modern C ++ geliştirme için en iyi uygulama değildir .
Aşağıda, C ++ 'da bir öğe listesinin nasıl yönetileceğine dair dört varyasyon uyguladım.
raw_pointer_demo
sizinkiyle aynı yaklaşımı kullanır - ham işaretçilerin kullanımıyla gerekli olan manuel bellek yönetimi. Burada C ++ kullanımı yalnızca sözdizimsel şeker içindir ve kullanılan yaklaşım, aksi takdirde C diliyle uyumludur.
- Gelen
shared_pointer_demo
liste yönetimi hala elle yapılır, ancak hafıza yönetimi otomatik (ham işaretçileri kullanmaz). Bu, muhtemelen Java ile yaşadıklarınıza çok benzer.
std_list_demo
standart kitaplık list
konteynerini kullanır . Bu, kendi kütüphanenizi sürmek yerine mevcut kitaplıklara güvenirseniz işlerin ne kadar kolaylaştığını gösterir.
std_vector_demo
standart kitaplık vector
konteynerini kullanır . Bu, liste depolamasını tek bir bitişik bellek ayırmasında yönetir. Başka bir deyişle, tek tek öğelere ilişkin işaretler yoktur. Oldukça aşırı bazı durumlar için, bu önemli ölçüde verimsiz hale gelebilir. Ancak tipik durumlarda, C ++ 'da liste yönetimi için önerilen en iyi uygulama budur .
Not: Bunların hepsinden sadece, raw_pointer_demo
hafızanın "sızmasını" önlemek için listenin açıkça imha edilmesini gerektirir. Diğer üç yöntem , kapsayıcı kapsam dışına çıktığında (işlevin sonunda) listeyi ve içeriğini otomatik olarak yok eder. Buradaki nokta şu: C ++, bu bakımdan çok "Java benzeri" olabilir - ancak yalnızca, programınızı emrinizde olan üst düzey araçları kullanarak geliştirmeyi seçerseniz.
/*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();
}