如何插入std :: map

时间:2010-04-26 11:07:23

标签: c++ map

在下面的代码中:

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;
}

如果我想使用map的insert方法而不是使用operator [],我应该怎么做(检查代码中注释的行)?
谢谢。

3 个答案:

答案 0 :(得分:3)

说真的,我不会这样做。

您只会不必要地使代码复杂化。您需要调用insert以在地图中生成新元素,然后对其进行修改。

只是为了它(避免双重查找,但建立一个不必要的空向量):

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 :(得分:1)

map::insert返回一个包含迭代器的pair元素(刚刚插入的元素或带有该键的现有元素)和一个表示成功或失败的布尔值。然后,您可以调用iter->push_back(lineCounter)将新行号添加到矢量。

......当你完成所有这些工作后,请发现这正是operator[]为你所做的。

答案 2 :(得分:1)

result.insert(pair<string,vector<int>>(*beg,100), vector<int>());
result[*beg].push_back(lineCounter);

这比当前代码更复杂(但也更慢:-),因为用单个语句实现了两件事:(隐式)在地图中插入一个空数组,然后向数组中添加一个新元素。 / p>