2013-06-23 34 views
7

Đây có thể là một câu hỏi đơn giản đối với một số bạn. Nhưng tôi đã tự hỏi nếu một std::string là một container. Theo vùng chứa, tôi có nghĩa là các vùng chứa như ví dụ std::vector, std::liststd::deque.C++ Là một std :: string a container?

std::basic_string<> chấp nhận các loại khác so với các ký tự không tách rời, nhưng cũng đang được tối ưu hóa bằng cách làm việc với các mảng ký tự. Nó không phải là thực sự rõ ràng với tôi trong đó thể loại nó rơi.

này sẽ biên dịch:

#include <string> 
#include <iostream> 

int main() { 
    std::basic_string<int> int_str; 
    int_str.push_back(14); 
    return 0; 
} 

Nhưng bằng cách thêm dòng này:

std::cout << int_str << std::endl; 

Nó sẽ không. Vì vậy, bởi những sự kiện này tôi có thể kết luận rằng một std :: basic_string không có ý định làm việc với các loại khác so với ký tự.

Đây có thể là một câu hỏi lạ đối với bạn. Lý do tôi cần biết điều này là bởi vì tôi đang làm việc trên một khuôn khổ và tôi vẫn không thể xác định trong đó một loại "chuỗi" sẽ giảm.

+0

Nói đúng ra, nó không phải là một phần của thư viện vùng chứa tiêu chuẩn. Nhưng mà thể loại để đưa nó vào phụ thuộc vào những gì bạn muốn làm với nó: theo nhiều cách, một chuỗi trông rất giống một container. – juanchopanza

+0

Nó không phải là chung chung, đủ để được một thùng chứa thích hợp. Bạn không thể tạo chuỗi từ 'struct X' hoặc' float'. –

+0

Tiêu chuẩn có khái niệm 'Container'. Đó là về định nghĩa tốt nhất mà chúng tôi có thể sử dụng cho câu hỏi này. – BoBTFish

Trả lời

9

Có, mẫu std::basic_string đáp ứng tất cả các yêu cầu của Container concept. Tuy nhiên, tôi nghĩ rằng nó có yêu cầu mạnh hơn về loại chứa. Chỉ cần cố gắng tìm hiểu chính xác những gì.

(Đây không phải là khái niệm Bjarne của. Chỉ cần các bit của Tiêu chuẩn dán nhãn "23.2.1 General container requirements".)

+1

Cảm ơn câu trả lời và liên kết đến khái niệm container. – Tim

1

Vâng nó là an toàn để nói nó không phải là một thùng chứa ít nhất là không theo cách thông thường bạn sẽ nghĩ của một std container.

Ví dụ đơn giản nhất là bạn không thể đặt bất kỳ thứ gì bạn muốn vào đó. Tuy nhiên, nó có một số phân loại của một container như thực tế là bạn có thể đặt một số loại cơ bản vào nó ngay cả khi chúng không phải là ký tự, và có lẽ điều tuyệt vời nhất là bạn có thể có được một iterator để nó như thể nó là một bình chứa bình thường.

Vì vậy, nó là một thùng chứa? Tôi sẽ nói có nhưng! nó không phải là tất cả.

+0

Bạn không thể đặt bất kỳ thứ gì bạn muốn vào một số thứ bạn thường nghĩ là "vùng chứa". Ví dụ, bạn có thể đặt một cái gì đó trong một 'std :: vector' nếu nó không phải là [' LessThanComparable'] (http://en.cppreference.com/w/cpp/concept/LessThanComparable), nhưng bạn không thể đặt nó thành một 'std :: set'. – BoBTFish

2

Theo tiêu chuẩn (2003,2011) std :: basic_string là vùng chứa chỉ dành cho loại POD. I.e. các kiểu cơ bản hoặc các cấu trúc/lớp đơn giản không có các hàm tạo, hàm hủy hoặc các hàm ảo. Nhưng gnu stdlib cho phép sử dụng các loại không phải POD với tiêu chuẩn :: basic_string. Here là ví dụ về cách làm việc với các loại basic_string và không phải POD.

Và nếu bạn biết những gì để làm ví dụ của bạn hoạt động, bạn nên xác định hành

std::ostream& operator<<(::std::ostream& out, std::basic_string<int> &dat) 
{ 
    out << dat[0]; 
    return out; 
} 

Hoặc một cái gì đó như thế.

Các vấn đề liên quan