Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
###Cpp_лкц1_1.09_11_#дляБАК#29_01_12.doc
Скачиваний:
67
Добавлен:
29.04.2019
Размер:
6.42 Mб
Скачать

Глава 12. Контейнерные классы

325

В шаблоне bitset определены методы преобразования в длинное целое и в строку, а также анализа значений множества:

unsigned long to_ulong() const; // в unsigned long

string to_string() const; // в string

size_t count О const; // количество битовых 1

size_t sizeO const; // количество битов

bool test(size_t pos) const; // true, если b[pos] == 1

bool any() const; // true, если хотя бы один бит равен 1

bool noneO const; // true, если ни один бит не равен 1

Определены также обычные операции ввода и вывода « и ». Биты множества выводятся с помощью символов '0' и 'Г слева направо, самый старший бит слева.

В битовом множестве не определены итераторы, поэтому оно не является контейнером в чистом виде, поскольку не полностью обеспечивает стандартный интерфейс контейнеров.

Пример использования контейнеров

Приведенная ниже программа формирует для заданного текстового файла указатель, то есть упорядоченный по алфавиту список встречающихся в нем слов, для каждого из которых показаны номера строк, содержащих это слово. Если слово встречается в строке более одного раза, номер строки выводится один раз.

#include <fstream> #include <iomanip> #include <string> #include <set> #include <map> using namespace std; typedef set<int, less<int> > set_i; typedef map<string. setj, less<string> > map_ss; bool wordreaddfstream &in, string &word. int &num){ char ch;

// Пропуск до первой буквы; for (;;){

in.get(ch);

if (in.failO) return false;

if (isalpha(ch) || ch == '_') break;

if (ch == '\n') num++;

}

word = "";

// Поиск конца слова;

do{

word += tolower(ch);

in.get(ch); }while (Nn.failO && (isalpha(ch) || ch « '_')); if (in.failO) return false;

326

Часть III. Стандартная библиотека

in.putback(ch); // Если символ - '\п' return true;

}

int main(){ map_ss m;

map_ss: iterator im; set_i::iterator is. isbegin, isend; string word; int num = 1;

ifstream in ("some_file"); if (!in){cout « "Cannot open input file.Vn"; exit(l);

}

while (wordreadd'n, word, num)){

im = m.find(word);

if (im == m.endO)

im = m.insert(map_ss;;value_type(word. set_i())).first;

(*im).second.i nsert(num);

}

for (im = m.beginO; im != m.endO: im++){

cout « setiosflags(ios;;left) « setw(15) « (*im).first.c_str();

isbegin = (*im). second. beginO;

isend = (*im).second.end():

for (is = isbegin; is != isend; is++) cout « " " « *is;

cout « endl;

}

return 0;

} Допустим, входной файл some_file содержит следующий текст:

class value_compare;

public binary_function <value_type. value_type. bool> { friend class map; protected; Compare comp;

value_compare(Compare c) ; comp(c) {} public; bool operatorO (const value_type& x, const value_type& y) const { return comp(x.first, y.first);} }: В этом случае программа выведет на экран:

binary_function 2

bool 2 6

с 5

class 1 3

comp 4 5 8

compare 4 5

const 7

first 8