vector so với danh sách trong STL


237

Tôi nhận thấy trong STL hiệu quả rằng

vector là loại trình tự nên được sử dụng theo mặc định.

Nó có nghĩa là gì? Dường như bỏ qua hiệu quả vectorcó thể làm bất cứ điều gì.

Bất cứ ai có thể cung cấp cho tôi một kịch bản vectorkhông phải là một lựa chọn khả thi nhưng listphải được sử dụng?


6
Mặc dù đó không phải là những gì bạn đã hỏi, nhưng đáng để chỉ ra rằng mặc định cho vectơ cũng có nghĩa là bạn có thể dễ dàng tương tác với mã cũ hơn, thư viện C hoặc thư viện không phải mẫu, vì vectơ là một trình bao bọc mỏng xung quanh mảng động "truyền thống" của một con trỏ và kích thước.

17
Bjarne Strostrup thực sự đã thực hiện một thử nghiệm trong đó anh ta tạo ra các số ngẫu nhiên và sau đó thêm chúng vào một danh sách và một vectơ tương ứng. Việc chèn thêm được thực hiện sao cho danh sách / vectơ được đặt hàng mọi lúc. Mặc dù đây thường là "danh sách miền", vectơ vượt trội hơn danh sách bằng một lề LỚN. Lý do là bộ nhớ tăng chậm và bộ nhớ đệm hoạt động tốt hơn cho dữ liệu tuần tự. Tất cả đều có sẵn trong bài phát biểu quan trọng của anh ấy từ "RunningNative 2012"
trốn


1
Nếu bạn muốn xem bài phát biểu của Bjarne Stroustrup mà @evading đã đề cập, tôi đã tìm thấy nó ở đây: youtu.be/OB-bdWKwXsU?t=2672
brain56 13/07/19

Câu trả lời:


98

Các tình huống mà bạn muốn chèn nhiều mục vào bất cứ đâu nhưng kết thúc một chuỗi liên tục.

Kiểm tra các đảm bảo phức tạp cho từng loại container khác nhau:

Các đảm bảo phức tạp của các container tiêu chuẩn là gì?


1
Chèn các phần tử ở cuối cũng được tính vì nó có thể dẫn đến phân bổ bộ nhớ và chi phí sao chép phần tử. Ngoài ra, việc chèn elenet vào lúc bắt đầu của một vectơ là không thể, listpush_front
Notinlist

9
Không, chèn các phần tử ở cuối vectơ được khấu hao theo thời gian không đổi. Việc phân bổ bộ nhớ chỉ thỉnh thoảng xảy ra và bạn có thể phân bổ vectơ để ngăn chặn nó. Tất nhiên, nếu bạn PHẢI đảm bảo các lần chèn liên tục theo thời gian, tôi đoán đây vẫn là một vấn đề.
Brian

15
@Notinlist - Đây có phải là "bên cạnh không thể" sau đây cho bạn không? v.insert (v.begin (), i)
Manuel

4
@Notinlist - Tôi đồng ý với bạn, chỉ là tôi không muốn OP nghĩ rằng giao diện không có trong trường hợp người ta muốn tự bắn vào chân (hiệu suất).
Manuel

16
Bjarne Strostrup thực sự đã thực hiện một thử nghiệm trong đó anh ta tạo ra các số ngẫu nhiên và sau đó thêm chúng vào một danh sách và một vectơ tương ứng. Việc chèn thêm được thực hiện sao cho danh sách / vectơ được đặt hàng mọi lúc. Mặc dù đây thường là "danh sách miền", vectơ vượt trội hơn danh sách bằng một lề LỚN. Lý do là bộ nhớ tăng chậm và bộ nhớ đệm hoạt động tốt hơn cho dữ liệu tuần tự. Tất cả đều có sẵn trong bài phát biểu của anh ấy từ "RunningNative 2012"
trốn

408

vectơ:

  • Ký ức tiếp giáp.
  • Phân bổ trước không gian cho các yếu tố trong tương lai, vì vậy cần thêm không gian ngoài những gì cần thiết cho chính các yếu tố đó.
  • Mỗi phần tử chỉ yêu cầu không gian cho chính loại phần tử (không có con trỏ phụ).
  • Có thể phân bổ lại bộ nhớ cho toàn bộ vector bất cứ khi nào bạn thêm một phần tử.
  • Các lần chèn vào cuối là không đổi, thời gian khấu hao, nhưng các lần chèn vào nơi khác là một O (n) tốn kém.
  • Các lần xóa ở cuối vectơ là thời gian không đổi, nhưng đối với phần còn lại thì đó là O (n).
  • Bạn có thể truy cập ngẫu nhiên các yếu tố của nó.
  • Trình vòng lặp không hợp lệ nếu bạn thêm hoặc xóa các phần tử đến hoặc từ vectơ.
  • Bạn có thể dễ dàng lấy được mảng bên dưới nếu bạn cần một mảng các phần tử.

danh sách:

  • Bộ nhớ không tiếp giáp.
  • Không có bộ nhớ được phân bổ trước. Chi phí bộ nhớ cho danh sách là không đổi.
  • Mỗi phần tử yêu cầu thêm không gian cho nút chứa phần tử, bao gồm các con trỏ tới các phần tử tiếp theo và trước đó trong danh sách.
  • Không bao giờ phải phân bổ lại bộ nhớ cho toàn bộ danh sách chỉ vì bạn thêm một yếu tố.
  • Chèn và tẩy là rẻ bất kể nơi nào trong danh sách chúng xảy ra.
  • Thật rẻ khi kết hợp danh sách với nối.
  • Bạn không thể truy cập ngẫu nhiên các yếu tố, do đó, việc truy cập vào một yếu tố cụ thể trong danh sách có thể tốn kém.
  • Trình vòng lặp vẫn hợp lệ ngay cả khi bạn thêm hoặc xóa các thành phần khỏi danh sách.
  • Nếu bạn cần một mảng các phần tử, bạn sẽ phải tạo một phần tử mới và thêm tất cả chúng vào phần tử đó, vì không có mảng bên dưới.

Nói chung, hãy sử dụng vectơ khi bạn không quan tâm loại thùng chứa tuần tự nào bạn đang sử dụng, nhưng nếu bạn đang thực hiện nhiều thao tác chèn hoặc xóa đến và từ bất kỳ nơi nào trong vùng chứa ngoài mục đích, bạn sẽ muốn để sử dụng danh sách. Hoặc nếu bạn cần truy cập ngẫu nhiên, thì bạn sẽ muốn có vector chứ không phải danh sách. Ngoài ra, có những trường hợp tự nhiên bạn sẽ cần cái này hoặc cái kia dựa trên ứng dụng của bạn, nhưng nói chung, đó là những hướng dẫn tốt.


2
Ngoài ra, phân bổ từ các cửa hàng miễn phí không phải là miễn phí. :) Thêm các mục mới vào một vectơ thực hiện phân bổ cửa hàng miễn phí O (log n), nhưng bạn có thể gọi reserve()để giảm số đó xuống O (1). Thêm các mục mới vào danh sách (nghĩa là không ghép chúng) sẽ thực hiện phân bổ cửa hàng miễn phí O (n).
bk1e

7
Một cân nhắc khác là listgiải phóng bộ nhớ khi bạn xóa các phần tử, nhưng vectorkhông. A vectorkhông làm giảm công suất của nó khi bạn giảm kích thước của nó, trừ khi bạn sử dụng swap()thủ thuật.
bk1e

@ bk1e: Tôi thực sự muốn biết thủ thuật của bạn trong dự trữ () và hoán đổi () :)
Dzung Nguyễn

2
@nXqd: nếu bạn cần thêm N phần tử vào một vectơ, hãy gọi v.reserve (v.size () + N) để nó chỉ thực hiện một phân bổ cửa hàng miễn phí. Thủ thuật hoán đổi () có tại đây: stackoverflow.com/questions/253157/how-to-downsize-stdvector
bk1e

1
@simplename Không. Những gì nó nói là chính xác. vectơ phân bổ không gian thừa ngoài không gian cho các phần tử hiện có trong vectơ; công suất bổ sung đó sau đó được sử dụng để phát triển vectơ sao cho phát triển nó được khấu hao O (1).
Jonathan M Davis

34

Nếu bạn không cần phải chèn các phần tử thường xuyên thì một vectơ sẽ hiệu quả hơn. Nó có địa phương bộ nhớ cache CPU tốt hơn nhiều so với một danh sách. Nói cách khác, việc tiếp cận một yếu tố làm cho nó rất có khả năng là các phần tử tiếp theo có mặt trong bộ nhớ cache và có thể được lấy ra mà không cần phải đọc RAM chậm.


32

Hầu hết các câu trả lời ở đây bỏ lỡ một chi tiết quan trọng: để làm gì?

Bạn muốn giữ gì trong containter?

Nếu đó là một tập hợp các ints, thì std::listsẽ mất trong mọi kịch bản, bất kể bạn có thể tái phân bổ hay không, bạn chỉ xóa từ phía trước, v.v. Danh sách chậm hơn để duyệt, mỗi lần chèn sẽ khiến bạn mất tương tác với bộ cấp phát. Sẽ rất khó để chuẩn bị một ví dụ, nơi list<int>nhịp đập vector<int>. Và thậm chí sau đó,deque<int> có thể tốt hơn hoặc đóng, không chỉ sử dụng danh sách, mà sẽ có chi phí bộ nhớ lớn hơn.

Tuy nhiên, nếu bạn đang xử lý các đốm dữ liệu lớn, xấu xí - và một vài trong số đó - bạn không muốn tổng thể hóa khi chèn và sao chép do phân bổ lại sẽ là một thảm họa - thì có lẽ, bạn có thể, tốt hơn là nên list<UglyBlob>hơnvector<UglyBlob> .

Tuy nhiên, nếu bạn chuyển sang vector<UglyBlob*>hoặc thậm chívector<shared_ptr<UglyBlob> > , một lần nữa - danh sách sẽ bị tụt lại phía sau.

Vì vậy, mẫu truy cập, số phần tử mục tiêu, v.v. vẫn ảnh hưởng đến việc so sánh, nhưng theo quan điểm của tôi - kích thước phần tử - chi phí sao chép, v.v.


1
Thêm một suy tư nữa, mà tôi đã có khi đọc "STL hiệu quả" của Meyers: một tính chất đặc biệt của list<T>nó là khả năng splicetrong O (1) . Nếu bạn cần nối thời gian liên tục, danh sách cũng có thể là cấu trúc của sự lựa chọn;)
Tomasz Gandor

+1 - Nó thậm chí không phải là một UglyBlob- ngay cả một đối tượng chỉ có một vài thành viên chuỗi có thể dễ dàng tốn kém để sao chép, do đó, việc phân bổ lại sẽ có giá. Ngoài ra: Đừng bỏ qua không gian trên đầu sự tăng trưởng theo cấp số nhân của mộtvector đối tượng giữ có kích thước vài chục byte có thể gây ra (nếu bạn không thể làm reservetrước).
Martin Ba

Đối với vector<smart_ptr<Large>> so với list<Large>- tôi sẽ nói, nếu bạn cần truy cập ngẫu nhiên vào các yếu tố, điều đó vectorcó ý nghĩa. Nếu bạn không cần truy cập ngẫu nhiên, listcó vẻ đơn giản hơn và nên thực hiện như nhau.
Martin Ba

19

Một khả năng đặc biệt của std :: list là nối (liên kết hoặc di chuyển một phần hoặc toàn bộ danh sách vào một danh sách khác).

Hoặc có lẽ nếu nội dung của bạn rất tốn kém để sao chép. Trong trường hợp như vậy, ví dụ, có thể rẻ hơn để sắp xếp bộ sưu tập với một danh sách.

Cũng lưu ý rằng nếu bộ sưu tập nhỏ (và nội dung không đặc biệt đắt tiền để sao chép), một vectơ vẫn có thể vượt trội hơn một danh sách, ngay cả khi bạn chèn và xóa ở bất cứ đâu. Một danh sách phân bổ từng nút riêng lẻ và điều đó có thể tốn kém hơn nhiều so với việc di chuyển một vài đối tượng đơn giản xung quanh.

Tôi không nghĩ rằng có những quy tắc rất khó khăn. Nó phụ thuộc vào những gì bạn chủ yếu muốn làm với container, cũng như mức độ lớn mà bạn mong đợi container và loại được chứa. Một vectơ thường bỏ qua một danh sách, bởi vì nó phân bổ nội dung của nó dưới dạng một khối liền kề duy nhất (về cơ bản nó là một mảng được phân bổ động và trong hầu hết các trường hợp, một mảng là cách hiệu quả nhất để chứa một loạt các thứ).


1
+1. Việc ghép nối bị bỏ qua, nhưng thật không may, không phải là thời gian liên tục như mong muốn. : (((Không thể là nếu danh sách :: kích thước là thời gian không đổi.)

Tôi khá chắc chắn danh sách :: kích thước là (được phép) tuyến tính vì lý do này rất.
ChúBens

1
@Roger: list::sizekhông nhất thiết là thời gian không đổi. Xem stackoverflow.com/questions/228908/is-listsize-really-ongcc.gnu.org/ml/libstdc++/2005-11/msg00219.html
Potatoswatter

@Potatoswatter: Tiêu chuẩn đó rất mơ hồ và do đó bạn không thể dựa vào các triển khai "tuân thủ" khiến nó càng trở thành vấn đề. Bạn thực sự phải tránh stdlib để có được một bảo đảm di động và đáng tin cậy.

@Roger: vâng, thật không may. Dự án hiện tại của tôi phụ thuộc rất nhiều vào các hoạt động mối nối và cấu trúc đó gần như thẳng C. Đáng tiếc hơn nữa, trong chuỗi N3000 splicegiữa các danh sách khác nhau được chỉ định là độ phức tạp tuyến tính và sizeđặc biệt không đổi. Vì vậy, để phù hợp với những người mới lặp đi lặp lại sizehoặc bất cứ điều gì, cả một lớp thuật toán nằm ngoài tầm với của STL hoặc bất kỳ khoảng thời gian chứa "tuân thủ" nào.
Potatoswatter

13

Vâng, các sinh viên của lớp tôi dường như không thể giải thích cho tôi khi sử dụng vectơ hiệu quả hơn, nhưng họ trông khá vui khi khuyên tôi sử dụng danh sách.

Đây là cách tôi hiểu nó

Danh sách : Mỗi mục chứa một địa chỉ cho thành phần tiếp theo hoặc trước đó, vì vậy với tính năng này, bạn có thể chọn ngẫu nhiên các mục, ngay cả khi chúng không được sắp xếp, thứ tự sẽ không thay đổi: hiệu quả nếu bộ nhớ của bạn bị phân mảnh. Nhưng nó cũng có một lợi thế rất lớn khác: bạn có thể dễ dàng chèn / xóa các mục, bởi vì điều duy nhất bạn cần làm là thay đổi một số gợi ý. Nhược điểm: Để đọc một mục ngẫu nhiên, bạn phải nhảy từ mục này sang mục khác cho đến khi bạn tìm thấy địa chỉ chính xác.

Vectơ : Khi sử dụng vectơ, bộ nhớ được tổ chức nhiều hơn như các mảng thông thường: mỗi mục thứ n được lưu trữ ngay sau mục (n-1) và mục trước (n + 1). Tại sao nó tốt hơn danh sách? Bởi vì nó cho phép truy cập ngẫu nhiên nhanh chóng. Đây là cách thực hiện: nếu bạn biết kích thước của một vật phẩm trong một vectơ và nếu chúng tiếp giáp nhau trong bộ nhớ, bạn có thể dễ dàng dự đoán vị trí của vật phẩm thứ n; bạn không cần phải duyệt tất cả các mục trong danh sách để đọc mục bạn muốn, với vectơ, bạn trực tiếp đọc nó, với danh sách bạn không thể. Mặt khác, sửa đổi mảng vectơ hoặc thay đổi một giá trị chậm hơn nhiều.

Danh sách phù hợp hơn để theo dõi các đối tượng có thể được thêm / xóa trong bộ nhớ. Các vectơ thích hợp hơn khi bạn muốn truy cập một phần tử từ một số lượng lớn các mục đơn lẻ.

Tôi không biết làm thế nào các danh sách được tối ưu hóa, nhưng bạn phải biết rằng nếu bạn muốn truy cập đọc nhanh, bạn nên sử dụng các vectơ, bởi vì các danh sách buộc chặt STL tốt như thế nào, nó sẽ không truy cập đọc nhanh hơn vectơ.


"Sửa đổi mảng vectơ hoặc thay đổi giá trị chậm hơn nhiều" - như đã đọc, điều này dường như mâu thuẫn với những gì bạn đã nói trước đây về việc vectơ được dự đoán là có hiệu suất tốt do tính chất thấp và liên tục của chúng. bạn có nghĩa là việc tái phân bổ nguyên vectornhân gây ra bằng cách thay đổi kích thước của nó có thể chậm? sau đó đồng ý, nhưng trong trường hợp reserve()có thể sử dụng, điều đó sẽ tránh được những vấn đề đó.
gạch dưới

10

Về cơ bản một vector là một mảng với quản lý bộ nhớ tự động. Dữ liệu tiếp giáp trong bộ nhớ. Cố gắng chèn dữ liệu ở giữa là một hoạt động tốn kém.

Trong danh sách dữ liệu được lưu trữ ở các vị trí bộ nhớ không liên quan. Chèn vào giữa không liên quan đến việc sao chép một số dữ liệu để nhường chỗ cho dữ liệu mới.

Để trả lời cụ thể hơn câu hỏi của bạn, tôi sẽ trích dẫn trang này

Các vectơ nói chung là hiệu quả nhất trong thời gian để truy cập các phần tử và để thêm hoặc loại bỏ các phần tử từ cuối chuỗi. Đối với các hoạt động liên quan đến việc chèn hoặc loại bỏ các phần tử tại các vị trí không phải là điểm cuối, chúng hoạt động kém hơn so với các bảng liệt kê và danh sách, và có các trình lặp và tham chiếu ít nhất quán hơn các danh sách.


9

Bất cứ lúc nào bạn không thể có iterators bị vô hiệu.


2
Nhưng không bao giờ chuyển đến kết luận đó về các trình vòng lặp mà không hỏi liệu các tham chiếu liên tục vào một dequesẽ đủ.
Potatoswatter

8

Khi bạn có rất nhiều chèn hoặc xóa ở giữa chuỗi. ví dụ như một trình quản lý bộ nhớ.


Vì vậy, sự khác biệt giữa chúng chỉ là hiệu quả, không phải là vấn đề chức năng.
skydoor

Cả hai đều mô hình một chuỗi các yếu tố của khóa học. Có một sự khác biệt nhỏ trong cách sử dụng, như được đề cập bởi @dirkgently nhưng bạn phải xem xét mức độ phức tạp của các thao tác "thường được thực hiện" của bạn để quyết định chọn chuỗi nào (câu trả lời @Martin).
AraK

@skydoor - Có một vài sự khác biệt về chức năng. Ví dụ, chỉ vector hỗ trợ truy cập ngẫu nhiên (nghĩa là có thể được lập chỉ mục).
Manuel

2
@skydoor: hiệu quả chuyển thành hiệu suất. Hiệu suất kém có thể làm hỏng chức năng. Hiệu suất là lợi thế của C ++, sau tất cả.
Potatoswatter

4

Giữ nguyên tính hợp lệ của các trình vòng lặp là một lý do để sử dụng danh sách. Một cách khác là khi bạn không muốn một vectơ phân bổ lại khi đẩy vật phẩm. Điều này có thể được quản lý bằng cách sử dụng dự trữ () thông minh, nhưng trong một số trường hợp, có thể dễ dàng hơn hoặc khả thi hơn khi chỉ sử dụng danh sách.


4

Khi bạn muốn di chuyển các đối tượng giữa các container, bạn có thể sử dụng list::splice.

Ví dụ, thuật toán phân vùng đồ thị có thể có số lượng đối tượng được chia theo cách đệ quy giữa số lượng container ngày càng tăng. Các đối tượng nên được khởi tạo một lần và luôn duy trì ở cùng một vị trí trong bộ nhớ. Sắp xếp lại chúng nhanh hơn nhiều bằng cách sắp xếp lại so với sắp xếp lại.

Chỉnh sửa: khi các thư viện chuẩn bị triển khai C ++ 0x, trường hợp chung của việc nối một chuỗi con vào danh sách đang trở nên phức tạp tuyến tính với độ dài của chuỗi. Điều này là do splice(bây giờ) cần lặp lại qua chuỗi để đếm số phần tử trong đó. (Vì danh sách cần ghi lại kích thước của nó.) Chỉ cần đếm và liên kết lại danh sách vẫn nhanh hơn bất kỳ thay thế nào và việc ghép toàn bộ danh sách hoặc một phần tử là các trường hợp đặc biệt với độ phức tạp không đổi. Nhưng, nếu bạn có chuỗi dài để nối, bạn có thể phải tìm kiếm một thùng chứa không tuân thủ tốt hơn, lỗi thời hơn.


2

Quy tắc cứng duy nhất ở đâu list phải được sử dụng là nơi bạn cần phân phối con trỏ tới các phần tử của vùng chứa.

Không giống như vector, bạn biết rằng bộ nhớ của các phần tử sẽ không được phân bổ lại. Nếu có thể thì bạn có thể có con trỏ đến bộ nhớ không sử dụng, tốt nhất là không lớn và tệ nhất là a SEGFAULT.

(Về mặt kỹ thuật một vectorsố *_ptrcũng sẽ làm việc nhưng trong trường hợp mà bạn đang bắt chướclist nên đó chỉ là ngữ nghĩa.)

Các quy tắc mềm khác phải được thực hiện với các vấn đề hiệu suất có thể có của việc chèn các phần tử vào giữa một container, trong đó listsẽ thích hợp hơn.


2

Làm cho nó đơn giản-
Vào cuối ngày khi bạn bối rối khi chọn các thùng chứa trong C ++, hãy sử dụng hình ảnh biểu đồ dòng chảy này (Nói cảm ơn với tôi): - nhập mô tả hình ảnh ở đây

Vectơ-
1. vectơ dựa trên bộ nhớ truyền nhiễm
2. vectơ là cách để tập hợp dữ liệu nhỏ
3. vectơ thực hiện nhanh nhất trong khi di chuyển trên tập dữ liệu
4. xóa vectơ chậm trên tập dữ liệu lớn nhưng nhanh với tốc độ rất nhỏ

Danh sách-
1. danh sách dựa trên bộ nhớ heap
2. danh sách là cách để tập hợp dữ liệu rất lớn
3. danh sách tương đối chậm khi truyền qua tập dữ liệu nhỏ nhưng nhanh ở tập dữ liệu lớn
4. xóa xóa danh sách rất nhanh tập dữ liệu lớn nhưng chậm trên những cái nhỏ hơn


1

Danh sách chỉ là một trình bao bọc cho một Danh sách liên kết đôi trong stl, do đó cung cấp tính năng mà bạn có thể mong đợi từ danh sách liên kết d cụ thể là chèn và xóa O (1). Trong khi các vectơ là chuỗi dữ liệu truyền nhiễm hoạt động như một mảng động.PS- dễ dàng di chuyển hơn.


0

Trong trường hợp của một vectơdanh sách , sự khác biệt chính liên quan đến tôi là như sau:

vectơ

  • Một vector lưu trữ các phần tử của nó trong bộ nhớ liền kề. Do đó, có thể truy cập ngẫu nhiên bên trong một vectơ, điều đó có nghĩa là việc truy cập một phần tử của vectơ rất nhanh vì chúng ta có thể nhân địa chỉ cơ sở với chỉ mục vật phẩm để truy cập phần tử đó. Trong thực tế, chỉ mất O (1) hoặc thời gian không đổi cho mục đích này.

  • Vì vectơ về cơ bản bao bọc một mảng, mỗi khi bạn chèn một phần tử vào vectơ (mảng động), nó phải tự thay đổi kích thước bằng cách tìm một khối bộ nhớ liền kề mới để chứa các phần tử mới tốn thời gian.

  • Nó không tiêu thụ thêm bộ nhớ để lưu trữ bất kỳ con trỏ đến các thành phần khác trong nó.

danh sách

  • Một danh sách lưu trữ các yếu tố của nó trong bộ nhớ không liền kề. Do đó, không thể truy cập ngẫu nhiên trong danh sách, điều đó có nghĩa là để truy cập các phần tử của nó, chúng ta phải sử dụng các con trỏ và duyệt qua danh sách chậm hơn so với vectơ. Điều này mất O (n) hoặc thời gian tuyến tính chậm hơn O (1).

  • Do danh sách sử dụng bộ nhớ không liền kề, nên thời gian để chèn một phần tử vào danh sách sẽ hiệu quả hơn rất nhiều so với trường hợp đối tác véc tơ của nó vì việc phân bổ lại bộ nhớ được tránh.

  • Nó tiêu thụ thêm bộ nhớ để lưu trữ con trỏ tới phần tử trước và sau một phần tử cụ thể.

Vì vậy, lưu ý những khác biệt này, chúng tôi thường xem xét bộ nhớ , truy cập ngẫu nhiên thường xuyên và chèn để quyết định người chiến thắng của vectơ so với danh sách trong một kịch bản nhất định.


0

Danh sách là Danh sách liên kết đôi nên dễ dàng chèn và xóa một phần tử. Chúng ta chỉ cần thay đổi một vài con trỏ, trong khi trong vectơ nếu chúng ta muốn chèn một phần tử vào giữa thì mỗi phần tử sau nó phải thay đổi theo một chỉ mục. Ngoài ra nếu kích thước của vectơ đầy thì trước tiên nó phải tăng kích thước của nó. Vì vậy, nó là một hoạt động đắt tiền. Vì vậy, bất cứ nơi nào thao tác chèn và xóa được yêu cầu phải được thực hiện thường xuyên hơn trong danh sách trường hợp như vậy nên được sử dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.