C++ 请解释使用std::ignore的代码

C++ 请解释使用std::ignore的代码,c++,c++11,C++,C++11,我正在阅读CPP参考资料中的文档。我发现很难理解这个对象的真正用途,而且示例代码也不太合理。例如,在下面的代码中,inserted如何以及为什么设置为true?这对我来说没什么意义 #include <iostream> #include <string> #include <set> #include <tuple> int main() { std::set<std::string> set_of_str; boo

我正在阅读CPP参考资料中的文档。我发现很难理解这个对象的真正用途,而且示例代码也不太合理。例如,在下面的代码中,
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";
    }
}
#包括
#包括
#包括
#包括
int main()
{
std::集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合集合;
布尔插入;
std::tie(std::ignore,inserted)=设置插入(“测试”);
如果(插入){
std::cout返回一对,其中第一个是插入元素的迭代器,第二个是表示元素是否插入的布尔值

创建左值引用的元组。当分配给
insert
的结果时,可以将
tie
中的变量设置为return
first
second
成员中的insert结果

是一个可以指定为而不产生任何效果的值


因此,基本上,这段代码忽略了元素的迭代器,其中
“Test”插入了
,并将
插入
到由
set::insert返回的指示是否插入了元素的配对成员中的第二个。

我认为Dave的答案很好,但我想解释一下为什么要使用这种方法

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

(var1,...,varN) = func_returning_tuple()

这有助于扩展代码的语义值,提高其可读性,否则,将有一个没有语义的单个变量(如T.Stand等),而C++则访问您必须使用的元组值:

varN = std::get<N>(my_tuple);
然后随意使用隔离变量,这将改进其他人(甚至你自己)阅读代码下一条语句的方式

std::ignore
是在您不关心返回的内容时使用的,在其他一些语言中,您也有此资源,例如在Scala中,这是下划线。例如,如果我在映射中使用insert函数,并且值已经存在,它只返回包含
的对(迭代器,false)
因此,如果我想要某个键的迭代器,即使我不关心它是否已经存在于映射中,我也可以使用以下行:

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

<> P>这是C++解决了元组和成对的可读性问题的方法。

你理解什么是<代码> STD::什么是<代码> STD::SETP/<代码>返回?@ XYMOSTACH,我知道什么是代码> TIG/<代码>。但是,我没有想到<代码>插入< /COD>。.second;
std::ignore
std::领带的家伙可能不会,但它可以节省代码,使用std::ignore更清晰。
std::tie( element_iterator, std::ignore ) = set_of_str.insert("test");