矢量<tuple>、make_tuple<int、忽略、浮点>

Vector<tuple>, make_tuple<int, ignore, float>

本文关键字:tuple gt lt 忽略 浮点 int make 矢量      更新时间:2023-10-16

我创建一个元组向量:

std::vector<std::tuple<int*, bool, int*>> *DataStucture;

接下来,我想遍历一个数据集,只获取每个元组的第一个元素。

这合法吗:

DataStructure -> push_back(std::make_tuple(some_pointer_to_some_int_value, std::ignore, std::ignore));

在下一轮数据集扫描中,我比较some_int_value的值,并在匹配时设置以下数据结构元素:

DataStructure -> push_back(std::make_tuple(std::ignore, some_bool_value, some_pointer_to_some_int_value2);

我不确定std::ignore到底是为了什么。我尝试检查 cpp 参考网站,但我没有得到它。

我正在阅读 http://en.cppreference.com/w/cpp/utility/tuple/ignore。

我认为你不能这样做,因为 std::ignore 只用作左值占位符。

例如,如果您有不想使用的返回值,则可以执行以下操作。

std::ignore = AFunctionWithAReturnValue();

它不能用作右值的一部分。出于您的目的,我只是在第一次扫描期间填写占位符值,如下所示:

std::make_tuple(some_pointer_to_some_int_value, false, nullptr);

只是为了详细说明我之前的评论,您不能在这里使用std::ignore,因为它只能用作左值,但实际上您也不需要。只需改用nullptr或任何"默认"值:

DataStructure->push_back(std::make_tuple(some_pointer_to_some_int_value, false, nullptr));

如果要将元组解压缩为不同的值,则应使用std::ignore,如下所示:

int* p; 
bool b; 
for (auto& tuple : *DataStructure) {
std::tie(p,b,std::ignore) = tuple;
// p now have value of first element of tuple
// b now have value of second element of tuple
}

在不相关的说明中,您的第二个操作不会设置现有元组的值,而是添加新元组的值。另外,为什么要使用指向vector的指针而不是vector本身或至少std::unique_ptr?通常认为最好省略不必要的"裸"指针。