Как вставить в std :: map - PullRequest
0 голосов
/ 26 апреля 2010

В коде ниже:

map<string,vector<int>> create(ifstream& in, const vector<string>& vec)
{
    /*holds string and line numbers into which each string appears*/
    typedef map<string,vector<int>> myMap;
    typedef vector<string>::const_iterator const_iter;

    myMap result;
    string tmp;
    unsigned int lineCounter = 0;

    while(std::getline(in,tmp))
    {
        const_iter beg = vec.begin();
        const_iter end = vec.end();

        while (beg < end)
        {
            if ( tmp.find(*beg) != string::npos)
            {   
                result[*beg].push_back(lineCounter);//THIS IS THE LINE I'M ASKING FOR
            }
            ++beg;
        }

        ++lineCounter;
    }

    return result;
}

Как мне это сделать (проверить строку с комментариями в коде), если я хочу использовать метод вставки карты вместо оператора []?
Спасибо.

Ответы [ 3 ]

3 голосов
/ 26 апреля 2010

Серьезно, я бы этого не делал.

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

Просто ради этого (избегая двойного поиска, но создавая ненужный пустой вектор):

result.insert( std::make_pair( *beg, std::vector<int>() ) )
      .first->second.push_back( lineCounter );

РЕДАКТИРОВАТЬ: реальный эквивалент (функциональность и производительность):

std::map<std::string,std::vector<int> >::iterator it = result.upper_bound( *beg );
if ( it->first != *beg ) {
   it = result.insert( it, std::make_pair( *beg, std::vector<int>() ) ).first;
}
it->second.push_back( lineCounter );
1 голос
/ 26 апреля 2010
result.insert(pair<string,vector<int>>(*beg,100), vector<int>());
result[*beg].push_back(lineCounter);

Это сложнее (но тоже медленнее :-), чем ваш текущий код, поскольку это позволяет достичь двух вещей с помощью одного оператора: (неявно) вставляет пустой массив в карту, а затем добавляет новый элемент вмассив.

1 голос
/ 26 апреля 2010

map::insert возвращает pair, содержащий итератор для элемента (либо только что вставленный, либо существующий с этим ключом) и логическое значение, указывающее успех или неудачу. Затем вы можете позвонить iter->push_back(lineCounter), чтобы добавить новый номер строки в вектор.

... и когда вы закончите со всем этим, поймите, что это именно то, что operator[] делает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...