创建矢量的问题

时间:2017-04-09 16:14:21

标签: c++ vector

我是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;
}

4 个答案:

答案 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++];
}