C ++宏添加到std :: map

时间:2014-11-16 02:16:00

标签: c++ macros

我对C ++很新。我上周刚刚开始接受它。

我正在尝试编写一个宏,以便能够访问并向std :: map添加项目。但是,我发现这不起作用。我做错了什么或有更好的方法来实现这个?

#include <iostream>
#include <string>
#include <map>

typedef struct {
  std::string name;
  int value;
} Token;

std::map<std::string, Token> ALL_TOKENS;

#define T(macro, name, value) \
  Token macro {name, value}; \
  ADD(name, macro); \
  T(TEST, "Test", 1); \

#define ADD(str, tok) \
  ALL_TOKENS.insert(std::pair<std::string, Token>(str, tok)); \

#define GET(str) \
  ALL_TOKENS[str]; \

int main(int argc, const char * argv[]) {
  Token tok = GET("Test");
  printf("%s", tok.name.c_str());
  return 0;
}

2 个答案:

答案 0 :(得分:1)

在我看来,你的宏使代码更难理解。它也让我觉得你还没有完全理解std::map

当我使用map时,我通常使用operator[]进行插入,也可能用于检索。如果你把它看作一个基本上可以使用任何(可排序)类型作为下标的数组,通常是最简单的。

例如,要计算每个单词在文件中出现的频率,您可以执行以下操作:

std::string word;
std::map<std::string, size_t> counts;

while (infile >> word)
    ++counts[word];

然后你可以用这样的代码打印出所有的单词和每个单词的频率(按字母顺序排列):

for (auto const &w : counts)
    std::cout << w.first << "\t" << w.second << "\n";

至少对我来说,这比我用你的宏编写的代码更简单,更容易理解。

答案 1 :(得分:0)

无视选择使用宏来访问功能......

由于您尚未向地图添加任何内容,因此未获得任何输出。

尝试

int main(int argc, const char * argv[]) {
  Token t{"Test", 10};
  ADD("Test", t);
  Token tok = GET("Test");
  printf("%s\n", tok.name.c_str());
  return 0;
}

你会得到一些输出。