Nó được xác định rõ để sử dụng số nguyên unsigned (và size_t
là unsigned) Bằng cách này, với wraparound: Hành vi đó được đảm bảo theo tiêu chuẩn, như trái ngược với với số nguyên ký kết, nơi nó không được đảm bảo theo tiêu chuẩn.
Tuy nhiên, không cần thiết thông minh.
Như một quy tắc chung, để tránh các sự cố do quảng cáo gói ẩn để không được ký, hãy sử dụng số nguyên không dấu cho công cụ cấp bit, sử dụng số nguyên đã ký cho số. Nơi bạn cần số nguyên đã ký tương ứng với size_t
có ptrdiff_t
cho bạn. Xác định hàm n_items
với kết quả đã ký, ví dụ:
using Size = ptrdiff_t;
template< class Container >
auto n_items(Container const& c)
-> Size
{ return end(c) - begin(c); }
và bạn đã sẵn sàng để tiếp tục, không còn sự ngớ ngẩn từ trình biên dịch nữa.
Thay vì mã cho quá thông minh
vector<int> v { 1,2,3,4,5 };
bool rev = true;
size_t start, end, di;
if (rev) {
start = v.size()-1;
end = -1;
di = -1;
}
else {
start = 0;
end = v.size();
di = 1;
}
for (auto i=start; i!=end; i+=di) {
cout << v[i] << endl;
làm ví dụ
const vector<int> v { 1,2,3,4,5 };
const bool reverse = true; // whatever
for(int i = 0; i < n_items(v); ++i)
{
const int j = (reverse? n_items(v) - i - 1 : i);
cout << v[j] << endl;
}
Nguồn
2015-01-31 03:15:45
Tiêu chuẩn xác định 'std :: string :: npos' là' static const size_type npos = -1; 'về cơ bản là một mẹo tương tự. Để được pedantic bạn có thể thích: 'std :: vector :: size_type bắt đầu, kết thúc, di;'. –
Galik
@Galic: Tôi không nhìn thấy những gì các pedantry (như bạn gọi nó) đạt được, những gì lợi thế nó có.Nếu một người duy trì đi ra khỏi con đường của mình để phá vỡ mọi thứ bằng instantiating 'std :: vector' với một cấp phát cung cấp một loại kích thước ngớ ngẩn, tất cả những gì mà người đi bộ làm là tăng cơ hội người đó thành công trong việc làm hỏng mọi thứ. Như tôi thấy. –
@ Cheersandhth.-Alf Có lẽ bạn đã đúng. Theo như tôi có thể nói mặc dù tiêu chuẩn nói 'std :: vector :: size_type' phải được unsigned, nhưng tôi nghĩ rằng nó có thể là một kích thước khác nhau để' std :: size_t'. Mặc dù tôi tưởng tượng hầu hết các triển khai sẽ làm cho 'size_type' giống như' size_t'. –
Galik