请解释一下使用std :: ignore的代码

tem*_*boy 27 c++ c++11

我正在阅读std::ignorecppreference 的文档.我发现很难掌握这个对象的真正目的,并且示例代码并没有做到这一点.例如,在下面的代码中,如何以及为什么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 sucessfully\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有人可以向我解释代码,我们将不胜感激.谢谢.

Dav*_*vid 40

set::insert 返回一对,其中first是插入元素的迭代器,第二个是bool,表示元素是否已插入.

std::tie创建一个左值引用元组.当分配到的结果从insert它使您能够在变量设置tie到插入的结果在返回pairfirstsecond成员.

std::ignore 是一个可以分配的值,但不起作用.

所以基本上,这段代码忽略了"Test"插入元素的迭代器,并指向返回的对insertedsecond成员set::insert,指示是否插入了元素.


Jul*_*ine 18

我认为Dave的答案非常好,但我想解释为什么要使用这种方法.

在Scala,Haskell或Python等其他语言中,你通常会出现元组(对两个元素的元组配对),并且它们有这种惯用的方式将它们分配给变量:

(var1,...,varN) = func_returning_tuple()
Run Code Online (Sandbox Code Playgroud)

这样做的目的是扩展代码的语义值并提高其可读性,否则你将拥有一个没有语义的单个变量(如t.first等),而在C++中访问元组的值你必须使用:

varN = std::get<N>(my_tuple);
Run Code Online (Sandbox Code Playgroud)

因此,只使用tie,您可以使示例代码更容易阅读,如下所示:

std::tie( element_iterator, inserted ) = set_of_str.insert("test");
Run Code Online (Sandbox Code Playgroud)

然后随意使用您的孤立变量,这改善了其他人(甚至您自己)阅读代码的下一个语句的方式.

std::ignore当你不关心什么是返回,在一些其他的语言,你也有这样的资源,在斯卡拉例如这是下划线使用.例如,如果我在map中使用insert函数并且值已经存在,它只返回包含的对(iterator,false),如果我想要一些键的迭代器,即使我不在乎它是否已经存在于地图中,我可以用这一行做:

std::tie( element_iterator, std::ignore ) = set_of_str.insert("test");
Run Code Online (Sandbox Code Playgroud)

这就是C++解决元组和对的可读性问题的方法.