读书人

问下 下面这段代码都有哪些有关问题

发布时间: 2013-08-04 18:26:16 作者: rapoo

问下 下面这段代码都有哪些问题


vector<string> ff(vector<int> vec, map<int, string> dict)
{
vector<string> svec;

for(size_t i = 0; i<=vec.size()-1; ++i)
{
if(!dict[vec[i]].empty())
svec.push_back(dict[vec[i]]);
}

return svec;
}



这是一道面试题目,我回答了dict[vec[i]]可能会存在越界,后面证明不会
还回答了如果vec.size为0的话,for(size_t i = 0; i<=vec.size()-1; ++i)就会变成
从0到4294967295的循环(当初只是不确定size_t的具体类型)

问下还有哪些错误

[解决办法]
还有:
1,参数应该传const引用
2,map的operator []会插入没有的参数,不能随便用
3,返回vector我也觉得不是太好,为了方便扩展尽量用iterator和STL算法。
[解决办法]
引用:
Quote: 引用:

感觉你说的错误都不是错误,我感觉就是这个代码效率太低了,


呵呵,size_t这个我已经确认

恩 一个有符号和没符号 没想到
[解决办法]
if(!dict[vec[i]].empty())

必要这样,会构造出map元素的,用count/find。
[解决办法]
个人感觉没有什么错误,除了你说的那个,剩下的就是效率问题,一些小细节
1 参数不该是值传递的,如果实参很大的话,拷贝到形参时很低效的。所以最好改成引用。
2 for循环里尽量用迭代器,更通用,可扩展
3 版主说的,【】这个操作符应用于map可能会出现问题,如果不存在map会插入这个值,如果不是本意就糟了

修改代码


ector<string> ff(vector<int> &vec, map<int, string> &dict)
{
vector<string> svec;

vector<int>::iterator iter = vec.begin();
for(; iter != vec.end; ++iter)
{
if(dict.count(*iter))
svec.push_back(dict[*iter]);
}
return svec;
}

[解决办法]
真正的错误就楼主自己说的那个,其他的都只是效率问题。

读书人网 >C++

热点推荐