C++ 如何插入到std::map中

C++ 如何插入到std::map中,c++,map,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&l

代码如下:

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创建(ifstream&in、const-vector&vec)
{
/*保存每个字符串出现的字符串和行号*/
typedef-map-myMap;
typedef向量::常量迭代器常量;
myMap结果;
串tmp;
无符号整数行计数器=0;
while(std::getline(in,tmp))
{
const_iter beg=vec.begin();
const_iter end=vec.end();
while(beg
如果我想使用map的insert方法而不是运算符[],我应该如何做(检查代码中注释的行)?

谢谢。

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


…当您完成所有这些操作后,请意识到这正是
操作符[]
为您所做的。

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

result.insert(pair<string,vector<int>>(*beg,100), vector<int>());
result[*beg].push_back(lineCounter);
…当您完成所有这些操作后,请意识到这正是
操作符[]
为您所做的。

结果。插入(pair(*beg,100),vector();
result.insert(pair<string,vector<int>>(*beg,100), vector<int>());
result[*beg].push_back(lineCounter);
结果[*beg]。推回(测线计数器);
这比您当前的代码更复杂(但也更慢:-),因为这可以通过一条语句实现两件事:(隐式地)在映射中插入一个空数组,然后向数组中添加一个新元素。

result.insert(pair(*beg,100),vector());
结果[*beg]。推回(测线计数器);

这比您当前的代码更复杂(但也更慢:-),因为这可以通过一条语句实现两件事:(隐式地)在映射中插入一个空数组,然后向数组中添加一个新元素。

说真的,我不会这么做

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

仅出于此目的(避免双重查找,但构建不必要的空向量):

result.insert(std::make_pair(*beg,std::vector())
.第一->第二。向后推(测线计数器);
编辑:实际等效(功能和性能):

std::map::iterator it=result.upper_-bound(*beg);
如果(它->第一次!=*乞讨){
it=result.insert(it,std::make_pair(*beg,std::vector())。首先;
}
它->秒。推回(线路计数器);

说真的,我不会这么做

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

仅出于此目的(避免双重查找,但构建不必要的空向量):

result.insert(std::make_pair(*beg,std::vector())
.第一->第二。向后推(测线计数器);
编辑:实际等效(功能和性能):

std::map::iterator it=result.upper_-bound(*beg);
如果(它->第一次!=*乞讨){
it=result.insert(it,std::make_pair(*beg,std::vector())。首先;
}
它->秒。推回(线路计数器);


我打赌尼尔·巴特沃斯知道这一点,为什么要替换那一行?
vec
元素上的内部循环是完全正常的。为什么不为
循环使用正常的
?我花了很多时间来弄清楚你的循环与普通循环有什么不同。@m我真的不认为while有问题(begvec
元素的内部循环是完全正常的。为什么不为循环使用正常的
?我花了很多时间来弄清楚你的循环与普通循环有什么不同。@m我真的不认为while有问题(beginsert(pair)
,它将返回插入迭代器的位置。所以以后就不需要查找了。@David我不会这么做,我只是想知道怎么做。@mAlters:我不知道这个评论是否是针对我之前的答案版本。无论如何,您必须在两个糟糕的选项中进行选择:一方面,如果元素不存在,您必须执行
find
,然后执行
insert
(这需要对每个新插入的元素进行两次查找),另一方面,您使用空向量执行插入,该向量将执行单个查找,但不必要地为元素实际存在的情况创建向量。确实是以前的版本,请忽略。关于当前版本:
insert()
接受提示,因此不需要再次查找。所以您可以执行
result.insert(lowerBoundHint,std::make_pair(*beg,std::vector(1,lineCounter))
我添加了这个版本(不知何故,我错过了map文档中的
插入(迭代器,值)
,我确实在寻找它)。我使用了
上限
,因为我更习惯于使用它,事实上,使用双向迭代器暗示上一个或下一个将大致相同。实际上,您希望首先查找元素,
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 );