我想用for_each打印一个矢量。
using namespace std;
struct Print {
int z = 0;
void operator()(int i) {
if (z) cout << ' ';
cout << i;
z = 1;
}
~Print() {
if (z) cout << endl;
}
};
main() {
vector<int> v = {1, 2, 3, 4, 5};
for_each(begin(v), end(v), Print());
}
它工作错误,它调用析构函数两次并打印两个换行而不是一行。为什么?任何人都可以解释这种奇怪行为的逻辑吗? BTW它可以与丑陋的全局变量一起使用。
int z;
struct Print {
void operator()(int i) {
. . .
};
我正在使用GCC。
答案 0 :(得分:3)
不是&#34;错误&#34;。您忘记了谓词被复制,至少一次。事实上,谓词被多次复制是合法的。你的班级应该考虑到这一点;并且 not 使其成员static
(打破后续调用)。 std::for_each
并非真正适合这项工作的工具。
答案 1 :(得分:1)
检查for_each的签名
template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
返回函数对象的副本。
答案 2 :(得分:0)
我找到了更好的解决方案。两个构造函数都应明确包含在Print类中。
Print() {}
Print(const Print&) {}
感谢Bo Persson和Gene解释逻辑。