我正在阅读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";
}
}
如果有人可以向我解释代码,我们将不胜感激。感谢。
答案 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 ++解决元组和对的可读性问题的方法。