【问题标题】:Vector<tuple>, make_tuple<int, ignore, float>Vector<tuple>,make_tuple<int,忽略,浮动>
【发布时间】:2016-11-24 16:51:40
【问题描述】:

我创建了一个元组向量:

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 元素:

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

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

【问题讨论】:

  • “some_int_value”与“一些指向 int 值的指针”不同。
  • @[Sam Varshavchik] 更改为指针。对不起。
  • 首先,您的第二个操作不完全是“设置以下两个元素”,它是添加新元组。其次,您不需要std::ignore,而是使用nullptrstd::ignore 用于将元组解包到不同的变量中,而不是创建它们。

标签: c++ vector tuples


【解决方案1】:

我正在阅读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);

【讨论】:

    【解决方案2】:

    只是为了详细说明我之前的评论,你不能在这里使用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?通常认为省略不必要的“裸”指针会更好。

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2016-12-13
      • 2018-03-01
      • 2014-03-25
      • 2011-01-29
      相关资源
      最近更新 更多