请解释这段使用std::ignore的代码
Please explain this code that uses std::ignore
我正在阅读cppreference关于std::ignore
的文档。我发现很难理解这个对象的真正目的,示例代码也没有很好地做到这一点。例如,在下面的代码中,如何以及为什么将inserted
设置为true?这对我来说没有多大意义。
#include <iostream>
#include <string>
#include <set>
#include <tuple>
int main()
{
std::set<std::string> set_of_str;
bool inserted;
std::tie(std::ignore, inserted) = set_of_str.insert("Test");
if (inserted) {
std::cout << "Value was inserted sucessfullyn";
}
}
如果有人能解释代码给我,它将是感激的。谢谢。
set::insert
返回一对对象,其中第一个是指向插入元素的迭代器,第二个是bool值,表示该元素是否插入。
std::tie
创建一个左值引用元组。当赋值给insert
的结果时,可以将tie
中的变量设置为返回pair
的first
和second
成员中插入的结果。
std::ignore
是一个可以赋值的值,没有任何影响。
因此,基本上,这段代码忽略了指向插入"Test"
的元素的迭代器,并将inserted
赋值给set::insert
返回的一对second
成员,这表明是否插入了元素。
我认为Dave的回答很好,但是我想稍微解释一下为什么要使用这种方法。
在Scala, Haskell或Python等其他语言中,通常会出现元组(由两个元素组成的元组),并且它们有这种惯用的方式将它们分配给变量:
(var1,...,varN) = func_returning_tuple()
这样做的目的是扩展代码的语义值并提高其可读性,否则您将拥有一个对其元素没有语义的单个变量(如t.first等),并且在c++中访问元组的值必须使用:
varN = std::get<N>(my_tuple);
因此,只使用tie,可以使示例代码更易于阅读,如下所示:
std::tie( element_iterator, inserted ) = set_of_str.insert("test");
然后随意使用你的独立变量,这改善了其他人(甚至你自己)阅读你代码的下一个语句的方式。
当你不关心返回的内容时使用std::ignore
,在其他一些语言中你也有这个资源,例如在Scala中,这是下划线。例如,如果我在map中使用insert函数,而值已经存在,它只会返回包含(iterator,false)
的对所以如果我想要某个键的迭代器,即使我不关心它是否已经存在于map中,我可以用这行来实现:
std::tie( element_iterator, std::ignore ) = set_of_str.insert("test");
这就是c++解决元组和对的可读性问题的方法。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- C++中的cin.ignore()函数不适用于整个流
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么这个涉及 cin 的代码即使使用 cin.ignore() 也会跳过 getline
- 请解释这段使用std::ignore的代码