最近由于大学要求,我从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", ×);
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]
不起作用。无论如何我能做到吗?谢谢
答案 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::pair
,std::tuple
是std::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}})。