Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ `每次自动生成一个新的变量实例?_C++_Auto - Fatal编程技术网

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
或显式)是完全正确的,不会产生额外的开销。