请解释这段使用std::ignore的代码

Please explain this code that uses std::ignore

本文关键字:ignore 代码 std 解释 段使用      更新时间:2023-10-16

我正在阅读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中的变量设置为返回pairfirstsecond成员中插入的结果。

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++解决元组和对的可读性问题的方法。