在c ++中用int创建元组

时间:2017-01-29 09:07:13

标签: c++ tuples

最近由于大学要求,我从python转换到了C ++,我很难理解C ++的synthax。

我的任务有问题,我必须接受一些整数并返回一个元组。这要求我将整数存储为不同点的元组

代码如下:

    #include <iostream>
    #include <string>
    #include <stdio.h>
    #include <tuple>
    #include <functional>

    using namespace std;

    int main()
    {
      int times;
      cin >> times;
      //scanf("%d", &times);

      int x_point;
      int y_point;
      int k;
      int iA[times];
      for ( k = 1; k <= times; k++)  
          cin >>  x_point >> y_point;
          iA[k] = make_tuple(x_point, y_point);

    }

我收到错误“错误:无法在赋值时将'std :: tuple'转换为'int'”我理解错误发生的位置,但我不知道将iA定义为哪种数据类型。

     tuple iA[times]

不起作用。无论如何我能做到吗?谢谢

3 个答案:

答案 0 :(得分:2)

#include<iostream>
#include<tuple>
#include<vector>
using namespace std;
int main()
{
    int times;
    cin >> times;

    int x_point;
    int y_point;
    int k;
    vector<tuple <int,int>> iA; 
    for ( k = 0; k <times; k++)  {
        cin >>  x_point >> y_point;
        iA.push_back(make_tuple(x_point, y_point));
    }
    return 0;
}

这似乎对我有用。这也需要库支持ISO C ++ 2011标准。这应该适用于c ++ 11编译器选项。

答案 1 :(得分:1)

make_tuple会将tuple的临时对象返回object of tuple而不是int[ index ]。这就是为什么编译告诉你:

错误:无法转换&#39; std :: tuple&#39;到&#39; int&#39;在任务中

你需要这样的东西(例如)
std::tuple< int, int, float > my_tuple = std::make_tuple< 1, 1, 1.1 >();

在c ++中,首先创建了std::pairstd::tuplestd::pair的复杂和高级用途。
实际上std :: pair很容易使用和理解,但std::tuple并不是因为它比std::pair有更多的模板编程。 我可以看到你在 python 中混淆了std::tuple同样在 c ++ 中。 在 c ++ 中,您已声明显式类型,但在 c ++ 11 之后,您可以使用自动:< / p>

auto my_tuple = std::make_tuple< 1, "hello" >();

同样使用std::pair,轻松打印输出:
std::cout << pair.first << " " << pair.second << std::endl;

但是std::tuple你应该使用:
第一个索引std::cout << std::get< 0 >( my_tuple ) << std::endl; 因此,一些没有模板经验的初学者将很难管理它。

我像你一样初学者,所以我建议你先使用std::pair,然后继续使用std::tuple,因为它对于初学者来说有点复杂。

很快就会看到我的githup有很多例子1000_examples_with_c++

答案 2 :(得分:1)

如果int iA[times];不是编译时常量,则

times不是标准C ++。它是一个GCC扩展(称为可变长度数组或VLA),它可能会或可能不会成为未来版本的C ++。如果您希望代码可移植,则不得使用。

正确,简单和正常的方法是使用 std::vector 。元素类型应为std::tuple<int, int>,因为您要存储整数对。变量名iA毫无意义,为什么不把它称为integers?或许你可以想出一个更具描述性的名字。

std::vector<std::tuple<int, int>> integers;

最初不需要初始化向量来保存times元素。您可以使用其push_back成员函数动态添加元素:

integers.push_back(std::make_tuple(x_point, y_point));

您当前的代码也会失败,因为它将数组视为基于一个数组。但它们是从零开始的(即它们的索引从 0 n-1 )。

您错过了{循环块周围的} / for花括号,这意味着只有cin >> x_point >> y_point;行被循环播放。

还有什么?不要使用using namespace std,在使用之前不要声明局部变量,使变量名称更具描述性,并且不要使用<stdio.h>中的工具(例如{ {1}})。