我对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;
}
答案 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;
}
你会得到一些输出。