- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这是一个 Minimal, Complete, Verifiable Example我知道这不是copacetic。无论如何,给定结构:
struct Foo {
int even;
int odd;
};
istream& operator>>(istream& lhs, Foo& rhs) {
int input;
lhs >> input;
(input % 2 == 0 ? rhs.even : rhs.odd) = input;
return lhs;
}
我可以做以下事情:
stringstream bar("1 2 3 4 5 6 7 8 9 0");
for (const auto& i : vector<Foo>{istream_iterator<Foo>(bar), istream_iterator<Foo>()}) {
cout << i.even << ' ' << i.odd << endl;
}
但是这给了我结果:
-1215720516 1
2 1
2 3
4 3
4 5
6 5
6 7
8 7
8 9
0 9
要对 Foo
进行零初始化,我可以编写代码:
for(Foo i{}; bar >> i; i = Foo{}) {
cout << i.even << ' ' << i.odd << endl;
}
这给出了我预期的结果:
0 1
2 0
0 3
4 0
0 5
6 0
0 7
8 0
0 9
0 0
我知道使用不完全覆盖变量的提取运算符是粗略的。这最初源于我的回答 here我的问题 here在我看来,它更自然地期望对读取之间的变量进行零初始化。在任何情况下,是否可以使用 istream_iterator
使变量在读取之间被零初始化,或者我必须使用 for
循环?
最佳答案
in my mind had a more natural expectation of zero-initializing the variable in-between reads
这是不正确的期望。 operator>>
应该完全并且单独负责初始化对象。您不能假设该对象之前已被默认/值初始化。一个非常标准的用例是在 while 循环中读取所有对象:
Foo foo;
while (std::cin >> foo) { ... }
第二次,foo
将具有旧值 - 这里没有任何归零。因此,您需要确保当您的运算符(operator)返回时,新对象已完全由您设置。
最简单的事情是先对其进行值初始化:
istream& operator>>(istream& lhs, Foo& rhs) {
int input;
lhs >> input;
rhs = Foo{}; // <== add this
input % 2 == 0 ? rhs.even : rhs.odd) = input;
return lhs;
}
或者,您可以手动编写两者:
if (input % 2 == 0) {
rhs.odd = 0;
rhs.even = input;
}
else {
rhs.odd = input;
rhs.even = 0;
}
或聚合初始化每个案例:
rhs = input % 2 == 0 ? Foo{input, 0} : Foo{0, input};
无论如何,operator>>
负责将您想要清零的值清零。
关于c++ - istream_iterator 不进行零初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37682156/
#include #include #include #include using namespace std; int main() { vector v(istream_itera
嗨,我希望有人能帮助理解下面代码的这种行为。 #include #include #include #include #include #include #include struct
我尝试实现“C++ 标准库”第 107 页中的流迭代器示例。我被困在这条线上: copy (istream_iterator(cin), istream_iterator(), back_insert
我在将 istream_iterator 用于我需要的目的时遇到困难。我有一个文件,我想将其逐行读取到一个集合中。我必须使用迭代器,我想知道我的代码或我的方法是否有问题。 非常感谢您的帮助。这是我正在
好吧,你们对我的最后一个问题很有帮助,所以我会尝试另一个问题。这也是作业,虽然上一个很旧,但已提交并等待标记。所以如果有什么东西会咬我,那可能就是这个问题。我混淆了类(class)名称等,因为仍然可以
我有两段代码。它们在 main() 中单独使用时可以正常工作。 vector v; cout start_cin(cin); istream_iterator end_of_cin; copy(st
我不明白为什么第二个参数 for_each 是一个空迭代器。有人可以向我解释一下吗? fstream("datfile.txt"); for_each(istream_iterator(datfile
给定一个包含以下十六进制代码的文件:0B 00 00 00 00 00 20 41 我正在尝试填充一个 std::vector ,然后手动检查每个字节。 这是我使用迭代器构造函数从两个 std::is
我尝试实现“C++ 标准库”第 107 页中的流迭代器示例。我被困在这条线上: copy (istream_iterator(cin), istream_iterator(), back_insert
给定一个包含以下十六进制代码的文件:0B 00 00 00 00 00 20 41 我正在尝试填充一个 std::vector ,然后手动检查每个字节。 这是我使用迭代器构造函数从两个 std::is
这是一个 Minimal, Complete, Verifiable Example我知道这不是copacetic。无论如何,给定结构: struct Foo { int even;
如果您将输入编码为 std::istream_iterator ii(std::cin); std::istream_iterator eos; std::for_each(ii,eos,record
我从标准输入得到以下输入: 2 5 2 1 5 3 4 5 2 5 1 3 4 第一行代表队列数(我们称这个值为n)。然后,对于每个队列,在第一行有一个值 l 表示队列的长度,后面是实际队列。 我正在
我正在尝试通过使用 std::distance 作为 vector 的构造函数参数来计算 std::cin 读取的元素数量,就像这样: // Gives correct amount, but now
我编写了以下程序,从 std::cin 读取 3 个数字,并将它们输出到 std::cout , 并执行两次: #include #include #include int main() {
在这种情况下,当从控制台获取字符串输入时,源代码结尾是什么? int main() { std::vector str; copy (istream_iterator(std::cin),
我在 istream_iterator 读取文件时遇到问题,因为它会忽略空行,但我需要将这些空行包含为“”。 我应该如何修改下面的程序以获得 vector 中的 5 条线? #include #in
我想读取以下输入: Foo 1 2 4 Bar 3 4 5 作为两个独立的“字符串”对象。 是否可以使用 istream_iterator 来完成此操作? 我在哪里可以找到所有这些迭代器的好文档? 最
我可以在两个 istream_iterators 之间进行赋值操作吗?如果是这样,那么行为会是什么,即两个迭代器是否会指向文件中的同一位置,即我们会得到两个指向文件中同一行的指针吗? 如果是这样,我可
我正在尝试从 ifstream fin 中读取并使用 istream_iterators 将其放入 vector vec1 中。我到处都看到了这些东西: vector vec1((istream_it
我是一名优秀的程序员,十分优秀!