C++ `每次自动生成一个新的变量实例?
我想知道是否每次使用C++ `每次自动生成一个新的变量实例?,c++,auto,C++,Auto,我想知道是否每次使用auto,或者其他类似于声明变量/iterator/callitwhatismoreappeal)的方法都会创建该项的实例?举例说明: void my_fun (std::unordered_map<std::string, std::string> & my_map) { std::string search_str; cin >> search_str; while (search_str != "someth
auto
,或者其他类似于声明变量/iterator/callitwhatismoreappeal)的方法都会创建该项的实例?举例说明:
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;
}
}
void my\u fun(标准::无序地图和我的地图){
字符串搜索;
cin>>搜索引擎;
while(search_str!=“某物”){
//下一行是否每次都会产生额外的开销?
自动搜索=我的地图。查找(搜索);
if(search!=my_map.end())
{
std::cout>search\u str;
}
}
是。例如,使用const auto&
或auto&&
声明引用,以避免创建对象的副本
然而,迭代器的开销很小,通常是按值传递的
更重要的是,您正在通过值传递参数
my\u map
。通过值传递将防止从函数外部看到对容器的任何更改(您正在编辑副本)。通过引用传递以避免不必要的复制。考虑到此特定代码:
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);
while(search_str!=“something”){
//下一行是否每次都会产生额外的开销?
std::无序映射::迭代器搜索=my\u map.find(search\u str);
并没有任何区别,编译器只是为您推断类型。若您询问是否在循环外声明迭代器:
std::unordered_map<std::string, std::string>::iterator search;
while (search_str != "something") {
search = my_map.find(search_str);
...
std::无序映射::迭代器搜索;
while(search_str!=“某物”){
search=my_map.find(search_str);
...
这将使它更高效,理论上是可能的(在一些坏编译器上),但我几乎不怀疑会有。代码可读性在这里更重要,因为在循环中声明变量的变体将使它更干净、更可读
注意将
search
类型更改为const auto&
或更明确的const std::unordered\u map::iterator&
在这种情况下也不太可能提高效率。使用auto
没有开销,您应该始终定义可以正确初始化的变量。@NeilButterworth我认为只声明一次所需的变量,然后使用该实例是一个重要的问题,特别是声明在一个循环中,可以运行数百万甚至数十亿次这里没有任何意义。auto
只是一个类型名称的替代品。你真正想问的是在循环中声明局部变量的后果。你的search
是一个局部变量。这不是因为你在声明中使用了auto
,而是因为你声明它的地方。如果你是考虑到性能,您应该通过引用传递mymap。@这只是一个例子,但我应该是一致的、固定的。find
按值返回迭代器,因此auto&
将只创建一个绑定到临时的const引用。在此处使用auto&
没有任何好处。edit:实际上它甚至没有要编译的eem(从右值初始化非常量引用无效…
)@Kevin是的,我更新为使用const auto&
。我的意图是给出一个通用示例,而不是本例中的确切答案。我还明确解释了迭代器最好在我的答案中按值传递。为什么不改为使用auto&
?:)注意:我将映射传递给函数只是为了制作一个简单的示例,任何人都可以看到这是一个已经充满数据的映射。真正的问题是在一个可以运行很长时间(数百万到数十亿次)的循环中声明auto(或任何其他可能需要时间的东西)。实际上在这种情况下,使用const auto&
根本不会改变“开销”,所以请回答“是”是不正确的。在这种特殊情况下也是如此。如果我想修改映射内的元素,我应该使用什么?(const会使其不可编辑,对吗?@AnnaK。您似乎误解了std::无序的\u map::find()
返回。它不是元素本身,而是迭代器。将其视为一种指针。因此,如果声明迭代器常量,则意味着您无法更改迭代器本身(例如,使其指向另一个元素)但这并不能阻止更改它所指向的元素。@AnnaK。为了简单起见-迭代器设计得小而有效,所以在这种情况下,在循环内声明迭代器(通过auto
或显式)是完全正确的,不会产生额外的开销。