在下面的代码中:
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 [],我应该怎么做(检查代码中注释的行)?
谢谢。
答案 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>