我正在阅读std::ignore
cppreference 的文档.我发现很难掌握这个对象的真正目的,并且示例代码并没有做到这一点.例如,在下面的代码中,如何以及为什么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
到插入的结果在返回pair
的first
和second
成员.
std::ignore
是一个可以分配的值,但不起作用.
所以基本上,这段代码忽略了"Test"
插入元素的迭代器,并指向返回的对inserted
的second
成员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++解决元组和对的可读性问题的方法.
归档时间: |
|
查看次数: |
4061 次 |
最近记录: |