将向量中的数字放到向量<vector>> 如果两个数字差为 1
Put numbers from vector to vector<vector>> if two number's difference is 1
我对这段代码有疑问,我无法意识到我做错了什么。
错误输出是这样的:
/storage/emulated/0/Documents/feladat.cpp:18:7: warning: expression result unused [-Wunused-value]
b[i, j] = b[a[i + 1], a[i]];
^
/storage/emulated/0/Documents/feladat.cpp:19:9: error: invalid operands to binary expression ('std::__ndk1::ostream' (aka 'basic_ostream<char>') and 'vector<vector<int> >')
cout<<b;
~~~~^ ~
/data/data/ru.iiec.cxxdroid/files/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../include/c++/4.9.x/ostream:218:20: note: candidate function not viable: no known conversion from 'vector<vector<int> >' to 'const void *' for 1st argument; take the address of the argument with &
basic_ostream& operator<<(const void* __p);
它在 ()s
中继续使用不同的类型
如果两个数的差是 1
,这将是一个将对放入 b
向量的程序。
这是我的代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
vector<vector<int>> b;
b.reserve(10);
int i = 0;
int j = 1;
for (i < a.size(); i++;)
{
for (j <= a.size(); j++;)
{
if (a[i + 1] - a[i] == 1)
{
b[i, j] = b[a[i + 1], a[i]];
cout << b;
}
}
}
return 0;
}
您在给定的代码片段中有 4 个问题:
- 这不是您索引二维数组的方式:
b[i, j]
。你用 b[i][j]
索引它。否则,您将使用 comma operator 来计算 单个 索引(b[i, j]
等同于 b[j]
)。
for
循环的形式为 for (initialization;comparison;increment)
。有些部分可以为空,但分号必须在那里。因此 for (i < a.size(); i++;)
应该是 for (;i < a.size(); i++;)
,或者 for (int i = 0; i < a.size(); i++;)
。 j
循环也是如此。
由于 b
的索引(可能未分配)space 导致的未定义行为。如果你想为每个向量创建 10 个元素,那么你可以使用 operator[]
,考虑通过 vector<vector<int>> b (10, vector<int> (10));
(或者,(vector<vector<int>> b (a.size (), vector<int> (a.size ()));
)而不是使用 reserve
.reserve
应该用于防止由于多个 push_back
s.
而导致的多次重新分配
注意,这样的改变会使循环for (;j <= a.size(); j++;)
索引向量的无效范围,因为它遍历[1, 10]
的值,而向量将包含 [0, 9]
的有效索引。您可以更改循环条件或索引(例如:b[i][j-1] = b[a[i + 1]-1][a[i]-1];
)。
std::vector
没有定义可用于打印的operator<<
。您需要决定如何打印 vector
,然后定义实现此类打印的函数。
我对这段代码有疑问,我无法意识到我做错了什么。
错误输出是这样的:
/storage/emulated/0/Documents/feladat.cpp:18:7: warning: expression result unused [-Wunused-value]
b[i, j] = b[a[i + 1], a[i]];
^
/storage/emulated/0/Documents/feladat.cpp:19:9: error: invalid operands to binary expression ('std::__ndk1::ostream' (aka 'basic_ostream<char>') and 'vector<vector<int> >')
cout<<b;
~~~~^ ~
/data/data/ru.iiec.cxxdroid/files/bin/../lib/gcc/arm-linux-androideabi/4.9.x/../../../../include/c++/4.9.x/ostream:218:20: note: candidate function not viable: no known conversion from 'vector<vector<int> >' to 'const void *' for 1st argument; take the address of the argument with &
basic_ostream& operator<<(const void* __p);
它在 ()s
中继续使用不同的类型如果两个数的差是 1
,这将是一个将对放入 b
向量的程序。
这是我的代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
vector<vector<int>> b;
b.reserve(10);
int i = 0;
int j = 1;
for (i < a.size(); i++;)
{
for (j <= a.size(); j++;)
{
if (a[i + 1] - a[i] == 1)
{
b[i, j] = b[a[i + 1], a[i]];
cout << b;
}
}
}
return 0;
}
您在给定的代码片段中有 4 个问题:
- 这不是您索引二维数组的方式:
b[i, j]
。你用b[i][j]
索引它。否则,您将使用 comma operator 来计算 单个 索引(b[i, j]
等同于b[j]
)。 for
循环的形式为for (initialization;comparison;increment)
。有些部分可以为空,但分号必须在那里。因此for (i < a.size(); i++;)
应该是for (;i < a.size(); i++;)
,或者for (int i = 0; i < a.size(); i++;)
。j
循环也是如此。由于
而导致的多次重新分配b
的索引(可能未分配)space 导致的未定义行为。如果你想为每个向量创建 10 个元素,那么你可以使用operator[]
,考虑通过vector<vector<int>> b (10, vector<int> (10));
(或者,(vector<vector<int>> b (a.size (), vector<int> (a.size ()));
)而不是使用reserve
.reserve
应该用于防止由于多个push_back
s.注意,这样的改变会使循环
for (;j <= a.size(); j++;)
索引向量的无效范围,因为它遍历[1, 10]
的值,而向量将包含[0, 9]
的有效索引。您可以更改循环条件或索引(例如:b[i][j-1] = b[a[i + 1]-1][a[i]-1];
)。std::vector
没有定义可用于打印的operator<<
。您需要决定如何打印vector
,然后定义实现此类打印的函数。