如何在c ++中制作静态地图?

时间:2015-06-10 14:07:36

标签: c++

我正在处理2个文件,让我们把file1.cpp和file2.cpp。 file1.cpp包含:

//File 1
#include <iostream>
#include <map>

struct category {
    int id;
};

void fun();

std::map<char, category> mymap1;
static std::map<char, category> mymap;
std::map<char, category>::iterator map_iter;
std::map<char, category>::iterator map_iter1;

int main ()
{

    mymap1['a'] = {20};
    mymap1['b'] = {30};
    mymap1['c'] = {40};

    for(int i = 0;i < 4; i++)
        fun();

    return 0;
}

//File 2
#include<file2.h>
void fun()
{
     mymap = mymap1;
     map_iter = mymap.begin();
     for (map_iter1 = mymap1.begin(); map_iter1 != mymap1.end();++map_iter1)
     {
        map_iter->second.id = map_iter1->second.id - map_iter->second.id;
        std::cout<<map_iter1->second.id<<"  " <<map_iter->second.id;
        map_iter->second.id=map_iter1->second.id;
        ++map_iter;
     }

}

我试图初始化mymap一次,当第一次for循环运行后,初始化不会发生,因为它发生在静态变量中。

但是每次mymap初始化时都不会显示此行为。

我不想要&#34; id&#34;每次都要初始化。

如何工作?

3 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,如果您只想将其初始化一次,则应在mymap函数中向fun()分配任何内容之前进行检查。

例如,您可以通过添加参数在函数中通过引用传递变量,让我们将其称为foo。在for循环之前将它初始化为0,在函数中添加一个检查以确保foo == 0并在最后增加它。

答案 1 :(得分:0)

创建一个返回静态地图的函数

static std::map<char, category> maps() {
    static std::map<char, category> m;
    //...
    return m;
}

答案 2 :(得分:0)

一般来说,“初始化一次”就像:

void foo()
{
    static bool first = true;

    if( first )
    {
        first = false;
        // first time init here
    }

    // rest of func here
}

还注意静态意味着什么:

全局变量上的静态:
 *只能在当地翻译单位访问

函数静态:
 *只能在当地翻译单位访问

静态的局部变量:
 *通过调用持续存在,即使在多个/递归调用上也只有一个实例

类/结构成员上的静态:
 *只有一个实例,无论父对象的数量是多少