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

时间:2013-04-26 01:36:29

标签: c++ c++11

我正在阅读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 sucessfully\n";
    }
}

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

2 个答案:

答案 0 :(得分:39)

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

std::tie创建一个左值引用元组。从insert分配给结果时,您可以将tie中的变量设置为返回pair的{​​{1}}和{{1}中的插入结果成员。

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

基本上,此代码忽略了插入first的元素的迭代器,并将second"Test"返回的inserted成员对齐,表示是否插入了一个元素。

答案 1 :(得分:17)

我认为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)的对,所以如果我想要一些键的迭代器,即使我不在乎它是否已经存在地图,我可以用这一行做到:

std::tie( element_iterator, std::ignore ) = set_of_str.insert("test");

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