使用C++在头文件中创建和填充地图

Nic*_*lai 2 c++ maps

看起来C++似乎没有办法做到这一点,但我希望我错了.

我想要做的是在头文件中创建一个映射(在这种情况下将一组字符串映射到另一组,而不是数据类型应该真正重要),以便多个源文件可以直接访问该映射.

现在我只是在我的头文件中定义了一个函数,并在源文件中实现了本质上完成这个功能,但我更喜欢使用地图,因为我可以一眼看出键/值是什么是.

我遇到的问题是填充地图需要可执行代码,我不能将其放入头文件中.有没有什么好方法可以实现我想做的事情?

Que*_*onC 6

有几种方法可以做到这一点.

您可以在头文件中声明变量,但需要在cpp文件中定义它...

// FOO.H STARTS HERE
#include <map>
#include <string>

extern std::map<std::string, std::string> my_map;
// FOO.H ENDS 

// FOO.CPP STARTS HERE
#include <iostream>

#include "foo.h"

std::map<std::string, std::string> my_map = {
  { "Cat", "Feline" },
  { "Dog", "Canine" },
  { "Fish", "Fish" }
};

int main (void) {
  for (auto i = my_map.begin(); i != my_map.end(); ++i) {
    std::cout << "A " << i->first << " is a " << i->second << std::endl;
  }

  return 0;
}

// FOO.CPP ENDS HERE
Run Code Online (Sandbox Code Playgroud)

或者,您可以将地图保留在标题中,只要它是常量. 这有一个缺点,它显然只有你不需要改变地图才有效.

// FOO.H STARTS HERE
#include <map>
#include <string>

const std::map<std::string, std::string> my_map = {
  { "Cat", "Feline" },
  { "Dog", "Canine" },
  { "Fish", "Fish" }
};

// FOO.H ENDS HERE

// FOO.CPP STARTS HERE
#include <iostream>

#include "foo.h"

int main (void) {
  for (auto i = my_map.begin(); i != my_map.end(); ++i) {
    std::cout << "A " << i->first << " is a " << i->second << std::endl;
  }

  return 0;
}

// FOO.CPP ENDS HERE
Run Code Online (Sandbox Code Playgroud)

这两个示例都假设使用C++ 11,以便使用漂亮而漂亮的map = { }初始化程序.


Que*_*onC 3

这是不使用 C++11 的解决方案。此示例还使用三个文件只是为了“证明”它的工作原理。

如果不打算更改映射,则应将初始化从 foo.cpp 移至 foo.h 并设为 const。

foo.h

// FOO.H STARTS HERE
#include <map>
#include <string>
#include <vector>

typedef std::pair<std::string, std::string> stringpair_t;
const stringpair_t map_start_values[] = {
  stringpair_t("Cat", "Feline"),
  stringpair_t("Dog", "Canine"),
  stringpair_t("Fish", "Fish")
};

const int map_start_values_size = sizeof(map_start_values) / sizeof(map_start_values[0]);

extern std::map <std::string, std::string> my_map;

// FOO.H ENDS HERE
Run Code Online (Sandbox Code Playgroud)

foo.cpp

// FOO.CPP STARTS HERE
#include <iostream>

#include "foo.h"

std::map<std::string, std::string> my_map (map_start_values, map_start_values + map_start_values_size);

int main2(void);

int main (void) {
  for (std::map<std::string, std::string>::const_iterator i = my_map.begin(); i != my_map.end(); ++i) {
    std::cout << "A " << i->first << " is a " << i->second << std::endl;
  }

  main2();

  return 0;
}

// FOO.CPP ENDS HERE
Run Code Online (Sandbox Code Playgroud)

foo2.cpp

// FOO2.CPP STARTS HERE
#include "foo.h"

#include <iostream>

int main2 (void) {
  for (std::map<std::string, std::string>::const_iterator i = my_map.begin(); i != my_map.end(); ++i) {
    std::cout << "A " << i->first << " is a " << i->second << std::endl;
  }

  return 0;
}

// FOO2.CPP ENDS HERE
Run Code Online (Sandbox Code Playgroud)