Jump to content

Questões sobre c++


Joao brandao
 Share

Recommended Posts

Boas pessoal, eu tive a ver algumas das resoluções da classificação das ONI11 e uma das soluções que gostei foi a do xtrm0 mas tinha aqui umas pequenas duvidas para o meio da resoluçao:

1º Duvida era pk ele faz #include <vector> e #include <list> e para que é que isto serve

2º Duvida tem haver com a primeira mas é no codigo mais em baixo, para que é que serve isto vector <vector <int> > bk; vector <int> ns(1003, 0); e como se usa?

3º Duvida era sobre isto for (int i=0; i<1003; i++) bk.push_back(vector <int>(1001, 0));, para que é que é o push_back e para que é que serve?

4º Duvida era sobre o que vem aseguir ao push_back, isto (vector <int>(1001, 0)), para que é que é isto?

Desculpem estar a perguntar este tipo de coisas mas é que nuna tinha visto algo assim :-S

Caso esteja muito confuso, avisem me sff que eu volto a colocar as questões de outra forma

#include <iostream>
#include <vector>
#include <list>
#include <stdio.h>

using namespace std;

vector <vector <int> > bk;
vector <int> ns(1003, 0); //isempty

int main() {
    int A, R;
    cin >> A >> R;
    char in[5];
    int AR = A+R;
    int op, sv;
    int ins;
    for (int i=0; i<1003; i++) bk.push_back(vector <int>(1001, 0));
    for (int x=0; x<AR; x++) {
        cin >> in;
        if (in[2]=='X') {
            for (op=1001; ns[op]==0; op--);
            for (sv=999; bk[op][sv]==0; sv--);
//            cout << bk[op][sv] << "   ins: " << (op*1000 + sv) << "   ns[op]: " << ns[op] << "   op: " << op << "   sv: " << sv << endl;
            cout << (op*1000+sv) << endl;
            bk[op][sv]--;
            ns[op]--;
        } else if (in[2]=='N') {
            for (op=0; ns[op]==0; op++);
            for (sv=0; bk[op][sv]==0; sv++);
            cout << (op*1000 + sv) << endl;
//            cout << bk[op][sv] << "   ins: " << (op*1000 + sv) << "   ns[op]: " << ns[op] << "   op: " << op << "   sv: " << sv << endl;
            bk[op][sv]--;
            ns[op]--;

        } else if (in[2]=='K') {
            cin >> ins;
            op=ins/1000;
            bk[op][ins%1000]++;
            ns[op]++;
//          cout << bk[op][ins%1000] << "   ins: " << (op*1000 + ins%1000) << "   ns[op]: " << ns[op] << "   op: " << op << "   sv: " << ins%1000 << endl;
        }
    }


    return 0;
}
Link to comment
Share on other sites

Nao te posso ajudar mais do que a dizer-te o nome dessas "coisas"; tambem é so o que eu sei.

Isso sao "templates". Sao, acho eu, uma especie de macros avancadas.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Não sou especialista em C++, mas julgo que:

1º Duvida era pk ele faz #include <vector> e #include <list> e para que é que isto serve

No código são usadas templates, classes e/ou métodos que estão definidos nesses ficheiros de cabeçalhos.

2º Duvida tem haver com a primeira mas é no codigo mais em baixo, para que é que serve isto vector <vector <int> > bk; vector <int> ns(1003, 0); e como se usa?

Essas duas linhas declaram dois vectores (um nome curioso para arrays dinâmicos, que controlam a sua própria alocação de memória, permitindo que aumentem e diminuam de número de elementos). O primeiro é um vector (array dinâmico) de vectores de inteiros e o segundo é um vector de inteiros, com um tamanho inicial de 1003 elementos, inicializados a 0.

3º Duvida era sobre isto for (int i=0; i<1003; i++) bk.push_back(vector <int>(1001, 0));, para que é que é o push_back e para que é que serve?

Como indica o ponto antes da palavra, 'push_back' é um método dos vectores. Serve para acrescentar um novo elemento no final do vector, ou seja, um vector de inteiros depois de todos os outros contidos em 'bk'.

4º Duvida era sobre o que vem aseguir ao push_back, isto (vector <int>(1001, 0)), para que é que é isto?

Isso é uma construção temporária dum vector de inteiros, de tamanho 1001, com os elementos inicializados a 0. Esse vector é construído aquando da chamada ao método 'push_back' e passado ao mesmo. Como é temporário é destruído imediatamente após à chamada do método.

A questão curiosa aqui seria o que iria acontecer ao vector 'bk' na linha seguinte, tendo agora um vector que foi destruído. O que se passa é que o método 'push_back' não coloca no vector o elemento passado mas sim uma cópia do mesmo, pelo que não há problema em passar um elemento temporário.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.