我想知道是否使用auto
或其他任何声明变量/迭代器/ CallItWhatIsMoreAppropriate的内容,每次都会创建该项目的实例?一个例子可以说清楚:
void my_fun (std::unordered_map<std::string, std::string> & my_map) {
std::string search_str;
cin >> search_str;
while (search_str != "something") {
//Does the next line create an extra overhead each time?
auto search = my_map.find(search_str);
if (search != my_map.end())
{
std::cout << "found \n";
//I should be able to modify the element inside the map here.
} else {
my_map.insert( {search_str, search_str});
}
cin >> search_str;
}
}
答案 0 :(得分:3)
考虑这个特殊代码:
while (search_str != "something") {
//Does the next line create an extra overhead each time?
auto search = my_map.find(search_str);
如果你的意思是有额外的开销vs:
while (search_str != "something") {
//Does the next line create an extra overhead each time?
std::unordered_map<std::string, std::string>::iterator search = my_map.find(search_str);
没有任何区别,编译器只是为你推断出类型。如果你询问是否在循环之外声明迭代器:
std::unordered_map<std::string, std::string>::iterator search;
while (search_str != "something") {
search = my_map.find(search_str);
...
会使它更有效率,理论上可行(在一些破碎的编译器上),但我几乎不怀疑会有任何。而且代码可读性在这里更为重要,因为变量内部循环声明变量会使其更清晰,更易读。
注意将search
更改为const auto &
或更明确的const std::unordered_map<std::string, std::string>::iterator &
,在这种情况下也不太可能提高效率。
答案 1 :(得分:2)
是。例如,如果您想避免创建对象的副本,请使用const auto&
或auto&&
来声明引用。
但是,迭代器的开销很小,通常按值传递。
更重要的是,您按值传递参数my_map
。按值传递将阻止从函数外部看到对容器的任何更改(您正在编辑副本)。通过引用传递,以避免不必要的复制。