我是C ++的初学者(使用C:B和eclipse),我正在尝试研究向量的基础知识,但我很难继续前进,并希望寻求帮助。
基本上,我必须创建2个向量(vet1类型int和vet2类型long)并按顺序连接它们以创建第三个向量类型short(vet3)。然后,从vet3元素逐个元素创建矩阵4x4(mat1)。
我的问题是创建vet3,程序停在那里。这可能是非常简单的事情,但我无法弄清楚。
如果我忘记了某些内容或需要更多信息,请告诉我。 PS:对不起我的英语,顺便说一句:)
using namespace std;
int main() {
vector<int> vet1; //Cria vector, tipo int, com nome vet1
vector<long> vet2; //Cria vector, tipo long, com nome vet2
vector<short> vet3; //Cria vector, tipo short, com nome vet3
vector<int> mat1[4][4]; //Cria matriz 4x4, tipo int, com nome mat1
int data, i, j, n = 0;
for (i = 0; i < 8; i++) //Laço para preencher o vet1 de dados
{
cout << "\nDigite um numero para a posicao " << vet1.size() << " do vetor 1: " << endl;
cin >> data;
vet1.push_back(data); //função que coloca o valor digitado no final do vetor vet1
}
for (i = 0; i < 8; i++)
{
cout << "\nDigite um numero para a posicao " << vet2.size() << " do vetor 2: " << endl;
cin >> data;
vet2.push_back(data); //função que coloca o valor digitado no final do vetor vet21
}
for (i = 0; i < vet1.size(); i++) //Laço para imprimir vet1
{
cout << "\t[" << vet1[i] << "]";
}
for (i = 0; i < vet2.size(); i++) //Laço para imprimir vet2
{
cout << "\t[" << vet2[i] << "]";
}
for (i = 0; i < 16; i++) //Laço que intercala vet1 e vet2 sequencialmente para criar vet3 com 16 posições
{
vet3[i+n] = vet1[i];
vet3[i+n+1] = vet2[i];
n++;
}
for (i = 0; i < vet3.size(); i++)
{
cout << "\t[" << vet3[i] << "]";
}
n = 0;
for (i = 0; i < 4 ; i++) //Laço para inserir todos os elementos do vet3 numa matriz quadrada 4x4
{
for (j = 0; j < 4; j++)
{
mat1[i][j] = vet3[n];
n++;
}
}
return 0;
}
答案 0 :(得分:1)
vet3
为空,因此vet3[i+n]
无效。您需要resize
或使用push_back
。
答案 1 :(得分:0)
您可以逐个放置向量中的项目:
for (const auto & elem : vet1)
vet3.emplace_back(elem);
for (const auto & elem : vet2)
vet3.emplace_back(elem);
你需要C ++ 11(我认为,不确定atm,因为它已经有一段时间了)用上面的代码编译...
您的代码仍然存在一些问题:将两个向量的元素组合成不同类型(在您的情况下为int = long =&gt; short)并没有多大意义。这可以防止你使用像std :: copy()这样的标准函数,这些函数在这种情况下会派上用场(或者不是,因为我非常确定这个练习的目的是手动完成,元素依据元件)。矩阵不需要&#34;向量&#34;在它的别名之前(&#34; int&#34;是你必须声明的)。
答案 2 :(得分:0)
same integer type
。vet3
应保留16
vector<int> vet3(16);
您的矩阵向量语句不正确,应为vector<vector<int> > mat1(4, vector<int>(4));
您插入的vet1和vet2方法错误,应该是这样的:
for (i = 0; i < 8; i++) //Laço que intercala vet1 e vet2 sequencialmente para criar vet3 com 16 posições
{
vet3[i*2] = vet1[i]; // even index
vet3[i*2+1] = vet2[i]; // odd index
}
完整的代码如下:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vet1; //Cria vector, tipo int, com nome vet1
vector<int> vet2; //Cria vector, tipo long, com nome vet2
vector<int> vet3(16); //Cria vector, tipo short, com nome vet3
vector<vector<int> > mat1(4, vector<int>(4)); //Cria matriz 4x4, tipo int, com nome mat1
int data, i, j, n = 0;
for (i = 0; i < 8; i++) //Laço para preencher o vet1 de dados
{
cout << "\nDigite um numero para a posicao " << vet1.size() << " do vetor 1: " << endl;
cin >> data;
vet1.push_back(data); //função que coloca o valor digitado no final do vetor vet1
}
for (i = 0; i < 8; i++)
{
cout << "\nDigite um numero para a posicao " << vet2.size() << " do vetor 2: " << endl;
cin >> data;
vet2.push_back(data); //função que coloca o valor digitado no final do vetor vet21
}
for (i = 0; i < vet1.size(); i++) //Laço para imprimir vet1
{
cout << "\t[" << vet1[i] << "]";
}
for (i = 0; i < vet2.size(); i++) //Laço para imprimir vet2
{
cout << "\t[" << vet2[i] << "]";
}
for (i = 0; i < 8; i++) //Laço que intercala vet1 e vet2 sequencialmente para criar vet3 com 16 posições
{
vet3[i*2] = vet1[i];
vet3[i*2+1] = vet2[i];
}
for (i = 0; i < vet3.size(); i++)
{
cout << "\t[" << vet3[i] << "]";
}
n = 0;
for (i = 0; i < 4 ; i++) //Laço para inserir todos os elementos do vet3 numa matriz quadrada 4x4
{
for (j = 0; j < 4; j++)
{
mat1[i][j] = vet3[n];
n++;
}
}
return 0;
}
希望这有帮助!
答案 3 :(得分:0)
我将在我的示例代码中写下我的评论:
#include <vector>
#include <iostream>
#include <algorithm>
#include <array>
// never use using namespace std!
// makes the result unecesary large
using std::vector;
using std::cout;
using std::cin;
using std::array;
int main()
{
int userInput;
vector<int> vet1;
vet1.reserve(8); // initialize the vector size
for (int i = 0; i < 8; i++)
{
cout << "Digite um numero para a posicao " << i << " do vetor 1: \n"; // dont use endl...
cin >> userInput;
vet1.push_back(userInput);
}
vector<long> vet2;
vet2.reserve(8);
for (int i = 0; i < 8; i++)
{
cout << "Digite um numero para a posicao " << i << " do vetor 2: \n";
cin >> userInput;
vet2.push_back(userInput);
}
// generate a lambda function that prints a vector element
auto printElement = [](auto element)
{
cout << "\t[" << element << "]";
};
//Laço para imprimir vet1
std::for_each(vet1.cbegin(), vet1.cend(), printElement);
//Laço para imprimir vet2
std::for_each(vet2.cbegin(), vet2.cend(), printElement);
vector<short> vet3(16); //initialize size
// now fill vector 3 with the elements from vector 1 interleaved with vector 2
for (int i = 0, i2 = 0; i<8; i++, i2 += 2)
{
vet3[i2] = vet1[i];
vet3[i2 + 1] = vet2[i];
}
// mat1 is actually not a matrix, as that is not a know type
// instead this is a jagged-array: an array of arrays.
// I will use the array data type for this
array<array<int, 4>, 4> mat1;
// as array has a fixed size, its elements are initialized
// using the default constructor (of int in this case)
// so I will copy your for construct
int n = 0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
mat1[i][j] = vet3[n++];
}