Tôi đang cố gắng nắm giữ tốt hơn về các trình lặp và các hàm chung. Tôi nghĩ rằng nó sẽ là một bài tập hữu ích để viết một hàm chuyển đổi container1 < container2 <type> >
thành container3 <type>
. Ví dụ: nó sẽ có thể chuyển đổi vector< deque<int> >
thành list<int>
.Chức năng chung để làm phẳng một hộp chứa
Tôi đã tìm tất cả quyền truy cập vùng chứa phải thông qua trình lặp, như các hàm trong <algorithm>
.
Đây là mã của tôi:
#include <iterator>
#include <algorithm>
// COCiter == Container of Containers Iterator
// Oiter == Output Iterator
template <class COCiter, class Oiter>
void flatten (COCiter start, COCiter end, Oiter dest)
{
using namespace std;
while (start != end) {
dest = copy(start->begin(), start()->end(), dest);
++start;
}
}
Nhưng khi tôi cố gắng gọi nó trong đoạn mã sau:
int main()
{
using namespace std;
vector< vector<string> > splitlines;
vector<string> flat;
/* some code to fill SPLITLINES with vectors of strings */
flatten(splitlines.begin(), splitlines.end(), back_inserter(flat));
}
tôi nhận được một thông điệp mẫu lỗi khổng lồ C++, undefined reference to void flatten< ... pages of templates ...
tôi cảm thấy như mã của tôi quá dễ viết và tôi phải cần thêm một số thứ để đảm bảo rằng loại dữ liệu trong các vùng chứa bên trong khớp với kiểu dữ liệu trong vùng chứa đầu ra. Nhưng tôi không biết phải làm gì.
Lưu ý rằng ngăn xếp không có trình lặp và không có chức năng bắt đầu/kết thúc. Nếu bạn muốn nó làm việc với các ngăn xếp, bạn sẽ chắc chắn phải có trường hợp đặc biệt. –
Đó là sự thật; Tôi sẽ thay đổi câu hỏi. Tôi không thực sự cần compatibiliy stack; chỉ các vùng chứa có thể lặp lại. – japreiss