我最近有点担心在c ++中滥用#define表示法,特别是竞争/数学编程。
我已经做了3个月的c ++(所以我是初学者)。几乎从我开始以来,我就使用了方便的
#define FOR(i,n) for(long (i)=0;(i)<(n);((i)++))
我必须说它让生活更轻松。
但最近我一直在使用
#define whole(x) begin(x),end(x)
执行accumulate(whole(iVector),0)
之类的操作。我觉得没关系。
但现在我做的事情(对于骑士广度优先搜索问题)。
#define QUICKINSERT(a,b) if(iSet.find(current+make_pair(a,b))==iSet.end()){ iQue2.push(current + make_pair(a,b)); iSet.insert(current + make_pair(a,b)); }
和
QUICKINSERT(x,y);
QUICKINSERT(y,x);
QUICKINSERT(-x,y);
QUICKINSERT(-y,x);
QUICKINSERT(x,-y);
QUICKINSERT(y,-x);
QUICKINSERT(-x,-y);
QUICKINSERT(-y,-x);
如果它被带走会有什么后果?什么是alernatives(lambda函数或什么)?
答案 0 :(得分:4)
这些宏看起来应该是函数。 评论中有很多论点,我将再添加一个: 你的宏与变量的命名紧密相关。
谁是iQue2
?什么是iSet
?
如果我想添加iSet2
和iQue
并对其执行相同操作该怎么办?
template<typename T>
T accumulate_all(const std::vector<T>& v) {
return std::accumulate(std::begin(v), std::end(v), 0);
}
template<typename T>
bool queue_if_not_in(std::set<T>& s, std::queue<T>& q, T& val) {
if (s.find(val) == s.end()) {
q.push(val);
s.insert(val);
return true;
}
return false;
}
您还可以查看here以查看宏可能导致什么,并且编译器在这种情况下无法提供帮助