Tôi muốn có thể chuyển đổi std :: stack <> thành std :: deque <>. Có chuyển đổi đơn giản không?Làm thế nào tôi có thể xây dựng hoặc trả lại deque cơ bản từ một ngăn xếp?
Trả lời
Bạn sẽ cần phải làm điều đó bằng tay:
while (!stk.empty())
{
deq.push_back(stk.top());
stk.pop();
}
Ah, ok - cảm ơn. Chỉ cần tự hỏi nếu tôi có thể làm điều đó mà không cần phải tạo một bản sao của ngăn xếp, và popping nó vào một deque. – BeeBand
@Stephen: Ngoại trừ 'deque' không có chức năng như vậy. :) – GManNickG
@GMan: Holy crap, bạn nói đúng. Làm cho tinh thần, cho rằng bạn sẽ không biết cách nào để phát triển nó. Tôi đoán bạn có thể tạo ra deque với 'std :: deque deq (stk.size());', nhưng sau đó bạn không thể sử dụng 'push_back'. – Stephen
Bạn cần phải bật tất cả các yếu tố ra khỏi ngăn xếp và vào một container khác nhau.
Nếu bạn cần làm điều này, có lẽ std::stack
là cấu trúc dữ liệu sai cho trường hợp sử dụng của bạn.
Vâng - nó để tôi có thể so sánh ngăn xếp. Hàm 'equal' trong lib chuẩn, cần một thùng chứa các hàm' begin() 'và' end() '. Và tôi cần phải dễ dàng nhìn thấy đảo ngược của ngăn xếp của tôi là tốt, vì vậy tôi nghĩ về việc chuyển đổi chúng để deques. – BeeBand
@BeeBand: Tại sao không chỉ sử dụng 'std :: deque' thay vì' std :: stack'? Nó có thể được sử dụng cho cùng một mục đích, thay vì 'top()', 'push()', và 'pop()', bạn cần sử dụng 'back()', 'push_back()' và 'pop_back() '. –
@James - vì cửa sổ bật lên, giao diện đẩy rất hữu ích. Tôi cần chức năng 'stack' (tức là' push', 'pop', và' top') và không muốn gọi 'push_back()' hoặc 'pop_back()'. – BeeBand
Tôi nghĩ nếu bạn cần điều này, bạn sẽ tốt hơn khi sử dụng deque ngay từ đầu, thay vì ngăn xếp. Không có cách nào nhận được ở lưu trữ cơ bản được sử dụng bởi bộ điều hợp ngăn xếp, nếu đó là những gì bạn đang yêu cầu.
@Neil, đó là chính xác những gì tôi đã hỏi có. Tôi hiểu rồi. tốt. Giao diện ngăn xếp phù hợp với nhu cầu của tôi - chỉ cần tôi có thể so sánh các mục trong ngăn xếp. – BeeBand
@BeeBand Thực sự, một deque khá nhiều công trình như một chồng anyway - bạn chỉ cần nói pop_front và push_back thay vì pop và đẩy. –
@Neil - điều này đúng. Tôi chỉ thích các tên hàm nhỏ, và ý tưởng của 'back' và' front' khiến mọi thứ trở nên khó hiểu với những gì tôi đang làm. – BeeBand
Có thể truy cập vào vùng chứa bên dưới mà không cần sao chép dữ liệu, nhưng nó đòi hỏi một số lượng nhất định của cái ác. Các container được tiếp xúc như một thành viên bảo vệ, được gọi là c
, cho phép tinh quái như thế này:
template <typename T>
class Shenanigans : private stack<T>
{
public:
explicit Shenanigans(stack<T>& victim) : victim(victim)
{
swap(victim);
}
~Shenanigans()
{
swap(victim);
}
using stack<T>::c;
private:
stack<T>& victim;
};
int main()
{
stack<int> s;
s.push(42);
{
Shenanigans<int> sh(s);
// The deque is accessible as sh.c, but the stack is temporarily empty.
cout << "Size: " << s.size() << " Data: " << sh.c.front() << "\n";
}
// The stack is restored.
cout << "Size: " << s.size() << " Data: " << s.top() << "\n";
}
Tất nhiên một giải pháp xa, xa hơn là chọn một container đáp ứng nhu cầu của bạn.
+1: Tôi không biết rằng nó được yêu cầu container phải được lưu trữ như một thành viên được bảo vệ có tên 'c'. –
+1 cho giải pháp tà ác – piotr
- 1. Làm thế nào để xây dựng một Terminal cơ bản từ đầu
- 2. Trả lại sớm từ một nhà xây dựng Scala
- 3. Làm thế nào tôi có thể trả lại một chuỗi rỗng (hoặc null) cho một PartialViewResult?
- 4. Làm thế nào tôi có thể xây dựng một tar từ stdin?
- 5. Làm thế nào tôi có thể trả về một đoạn văn bản từ một hàm XPath?
- 6. Làm thế nào tôi có thể trả lại một giá trị ngẫu nhiên từ một mảng?
- 7. Làm thế nào để xây dựng một ví dụ bảo vệ rất cơ bản?
- 8. Làm thế nào để thiết kế một ngăn xếp monadic?
- 9. Làm thế nào để lát một deque?
- 10. Làm thế nào để bạn xây dựng một ngăn xếp Android trở lại khi một hoạt động được bắt đầu trực tiếp từ một thông báo?
- 11. Không hiển thị đường dẫn tệp của máy xây dựng trong ngăn xếp ngăn xếp
- 12. Làm thế nào tôi có thể xây dựng một 'sơ đồ cây phụ thuộc' từ giải pháp .NET của tôi
- 13. Làm thế nào tôi có thể xây dựng một ngữ pháp sạch, giống Python trong ANTLR?
- 14. Làm thế nào tôi có thể tĩnh xây dựng GDB từ nguồn?
- 15. Làm cách nào để tôi có thể trả lại ngoại lệ trong Javascript, nhưng vẫn giữ nguyên ngăn xếp?
- 16. Làm thế nào tôi có thể xây dựng một cây gia đình với Perl?
- 17. Làm thế nào để bạn xây dựng một debug .exe (MSVCRTD.lib) chống lại một phát hành xây dựng lib (MSVCRT.lib)?
- 18. Làm thế nào tôi có thể xây dựng một gói phần mở rộng Safari từ dòng lệnh?
- 19. Làm thế nào tôi có thể xuất bản một dự án ASP.NET MVC từ dòng lệnh?
- 20. Làm thế nào để ngăn chặn Eclipse xây dựng lại không gian làm việc?
- 21. làm thế nào tôi có thể phiên bản một ứng dụng java giữa các bản dựng?
- 22. Làm thế nào tôi có thể xây dựng lại mod_wsgi của tôi để sử dụng python 2.7.3?
- 23. Làm thế nào: Ruby on Rails để xây dựng một trang web cơ bản
- 24. Có thể xếp hàng :: pop trả lại giá trị ngay bây giờ?
- 25. Làm thế nào để tôi có thể kiểm tra các ứng dụng Flex từ bên trong IDE hoặc một kịch bản xây dựng?
- 26. Làm thế nào tôi có thể xây dựng một chuỗi json trong javascript/jquery?
- 27. Làm thế nào tôi có thể xây dựng một truy vấn dựa tình trạng laravel
- 28. Trong scons, làm thế nào tôi có thể tiêm một mục tiêu được xây dựng?
- 29. Làm thế nào để xây dựng src từ một CygPort?
- 30. Làm thế nào tôi có thể bản địa hóa các biến Perl trong một khung ngăn xếp khác nhau?
Tôi nghĩ bạn sẽ chỉ cần sao chép dữ liệu từ tài khoản này sang tài khoản khác. –