Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > разобраться с функцией


Автор: compiler91 2.7.2008, 21:24
Добрый день!
Помогите пожалуйста разобраться с функцией..  smile 
(функция инициализирует карту(map) из файла, где ключем становится первое слово в строке, а остальные слова строки, становятся значениями)
Код

/ * Essential C++ -- Stanley Lippman*/
void populate_map( ifstream &nameFile,
                   map<string,vstring> &families )
{
    string textline;
    while ( getline( nameFile, textline, '\n' ))
    {
        string fam_name;
        vector<string> child;
        cout << "textline: " << textline << endl;

        string::size_type pos = 0, prev_pos = 0,  /*кто такой size_type?*/
                          text_size = textline.size();

        if ( ! text_size )
             continue;

        // ok: find each word separated by a space
        while ((  pos = textline.find_first_of( ' ', pos )) 
                     != string::npos ) /*а что тут делает npos?*/
        {
            string::size_type end_pos = pos-prev_pos;
            if ( ! prev_pos )
                 fam_name = textline.substr( prev_pos, end_pos  );
            else child.push_back(textline.substr(prev_pos,end_pos));
            prev_pos = ++pos;
        }
     
        // now handle last child
        if ( prev_pos < text_size )
             child.push_back(textline.substr(prev_pos,pos-prev_pos)); 

        cout << "family name: " << fam_name
             << " children: "   << child.size() << endl;

        if ( ! families.count( fam_name ))
             families[ fam_name ] = child;
        else cerr << "Oops! We already have a "
                  << fam_name << " family in our map!\n";
    }
}

заранее благодарен.

Автор: xvr 3.7.2008, 11:02
typedef basic_string<char> string;
Цитата

basic_string::size_type

An unsigned integer type that can represent the number of elements and indices in a string.

typedef implementation-defined size_type;

Remarks
It is equivalent to allocator_type::size_type.
For type string, it is equivalent to size_t.


Цитата

basic_string::npos

An unsigned integral value initialized to –1 that indicates either "not found" or "all remaining characters" when a search function fails.

static const size_type npos = -1;

Remarks
When the return value is to be checked for the npos value, it might not work unless the return value is of type size_type and not either int or unsigned.

RTFM MSDN  smile 

Автор: compiler91 3.7.2008, 15:25
Хорошо.. Чем size_type лучше int?

Автор: jonie 3.7.2008, 15:42
это разные типы потому что. посмотрите в их определеения. на одной машине size_type может быть int, а на другой какой-нибудь __int64 

Автор: compiler91 3.7.2008, 15:58
Цитата
это разные типы потому что. посмотрите в их определеения. на одной машине size_type может быть int, а на другой какой-нибудь __int64
то есть я могу спокойно заменять  в исходниках size_type на  int?

Автор: JackYF 3.7.2008, 17:10
Цитата(compiler91 @  3.7.2008,  14:58 Найти цитируемый пост)
то есть я могу спокойно заменять  в исходниках size_type на  int? 

За это ты заплатишь непортабельностью твоей программы на другие архитектуры. Скажем, при переходе на 64-битные процессоры хотя бы.

Чем тебе size_type не угодил?

Автор: compiler91 3.7.2008, 17:58
Цитата
Чем тебе size_type не угодил? 
я просто не могу понять его сущность и предназначение  smile 

Автор: jonie 3.7.2008, 18:18
как уже говорилось суть и назначение : возможность использования твоего кода на разных платформах (и даже реализациях STL) без (ну почти всегда) проблем при переносе. но типы, повторюсь разные. typedef не есть define. он опредялет новый тип, посему лучше его имхо и использовать, где это уместно.

Автор: compiler91 3.7.2008, 18:54
Цитата

как уже говорилось суть и назначение : возможность использования твоего кода на разных платформах (и даже реализациях STL) без (ну почти всегда) проблем при переносе. но типы, повторюсь разные. typedef не есть define. он опредялет новый тип, посему лучше его имхо и использовать, где это уместно.
То есть size_type  это целочисленный  тип неизвестных размеров? А зачем тогда он привязывается к базовому типу? Или при разных базовых типах он может принимать разные типы на одной и той же платформе?

Автор: JackYF 3.7.2008, 20:02
Цитата(compiler91 @  3.7.2008,  17:54 Найти цитируемый пост)
А зачем тогда он привязывается к базовому типу?

Что ты этим хотел сказать? Понимаешь, что такое typedef?

Автор: compiler91 3.7.2008, 20:18
typedef, создает синоним для имени типа, а define - это макрос меняющий исходник до процесса компиляции, так?

Автор: JackYF 4.7.2008, 00:34
compiler91, верно. Так что тебя всё-таки смущает?

Автор: compiler91 4.7.2008, 11:48
Цитата
Так что тебя всё-таки смущает?
 если size_type это один из typedef-ов, то почему он объявляется так: string::size_type, какое отношение он имеет к string? Или он  прописывается там?
 smile 

Автор: JackYF 4.7.2008, 13:17
Цитата(compiler91 @  4.7.2008,  10:48 Найти цитируемый пост)
какое отношение он имеет к string?

Самое прямое. У разных классов могут быть разные типы: string::size_type и vector::size_type могут быть разными типами.

Цитата(compiler91 @  4.7.2008,  10:48 Найти цитируемый пост)
Или он  прописывается там?

Можно и так сказать.

Автор: compiler91 4.7.2008, 13:48
Вроде разобрался.. Всем ОГРОМНОЕ спасибо...

---
просьба поднять репутацию..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)