Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kolejność elementów w vector

Ostatnio zmodyfikowano 2021-10-12 19:06
Autor Wiadomość
krystian123456
Temat założony przez niniejszego użytkownika
Kolejność elementów w vector
» 2021-10-11 12:30:29
Czy jeśli umieścimy dwa elementy w vectorze, oraz chcemy usunąć pierwszy, to usuwany jest drugi a pierwszy przerabiany na drugi ?
P-179003
DejaVu
» 2021-10-11 12:32:06
Jak chcesz usunąć pierwszy element to pierwszy zostanie usunięty i wszystko zostanie przesunięte tak, aby tablica była ciągła.
P-179004
krystian123456
Temat założony przez niniejszego użytkownika
» 2021-10-11 13:43:31
A na czym jest oparty mechanizm przesuwania elementów?
P-179005
DejaVu
» 2021-10-11 13:46:22
Raczej nie powinno Ciebie interesować jak działa implementacja w szczegółach, tylko jak funkcjonalność działa. W skrócie: wartości występujące po elemencie, który został usunięty są przesuwane na wcześniejsze pozycje, więc złożoność obliczeniowa zadania to O(n), gdzie n to liczba elementów występujących po usuniętym elemencie.
P-179006
krystian123456
Temat założony przez niniejszego użytkownika
» 2021-10-12 10:58:43
A jeśli tworzę obiekt statycznie i dodam go do vector, potem usunę to obiekt pierwotny też jest usuwany czy tylko kopia w vector?
P-179007
DejaVu
» 2021-10-12 10:59:51
Cokolwiek dodajesz do vectora jest kopiowane (chyba, że użyjesz std::move i emplace_back, ale tego na pewno nie znasz).
P-179008
krystian123456
Temat założony przez niniejszego użytkownika
» 2021-10-12 11:28:05
Więc mam pytanie od takiego kodu, obiekty tworzone dynamicznie a potem dodane do vector i po jakimś czasie z niego usuwane, ale czy orginalne obiekty nie będą nadal w pamięcie i zajmować RAM?

C/C++
#include <SFML/Graphics.hpp>
#include <iostream>
#include <vector>
#include "defined.hpp"
#include "console.cpp"
#include "window.cpp"

using namespace std;
class Trash
    : public sf::CircleShape
{
public:
   
unsigned int speed = 3 + rand() % 5;
   
bool undestructable = false;
   
bool followMouse = false;
   
float rot = rand() % 21 - 10;
   
float x = 0;
   
int ncoll = 0;
   
sf::Time cooldown = sf::milliseconds( 5000 + rand() % 5000 );
   
sf::Time start;
   
Trash()
        :
sf::CircleShape()
   
{ }
   
Trash( float r, sf::Clock & clock ) {
       
this->setRadius( r );
       
this->start = clock.getElapsedTime();
       
this->setOrigin( r, r );
       
this->setOutlineColor( sf::Color( 0x000000ff ) );
       
this->setOutlineThickness( 2 );
   
}
   
bool isCollision( Trash & target ) {
       
       
if( this->getGlobalBounds().intersects( target.getGlobalBounds() ) ) {
           
this->ncoll += 1; target.ncoll += 1;
           
this->setOutlineColor( sf::Color( 0xff0000ff ) );
           
target.setOutlineColor( sf::Color( 0xff0000ff ) );
           
float mx = this->getGlobalBounds().width - abs( abs( this->getGlobalBounds().left ) - abs( target.getGlobalBounds().left ) );
           
           
if( this->getPosition().x < target.getPosition().x ) {
               
this->x = -( float )( this->speed ); target.x = target.speed;
               
this->move( - mx / 2.0, 0 ); target.move( mx / 2.0, 0 );
           
}
           
else {
               
this->x = this->speed; target.x = -( float )( target.speed );
               
this->move( mx / 2.0, 0 ); target.move( - mx / 2.0, 0 );
           
}
           
return true;
       
}
       
return false;
   
}
   
bool isCollision2( Trash & target ) {
       
float mr;
       
if(( mr = sqrt( pow( this->getPosition().x - target.getPosition().x, 2 ) + pow( this->getPosition().y - target.getPosition().y, 2 ) ) ) <
       
this->getRadius() + target.getRadius() ) {
           
this->ncoll += 1; target.ncoll += 1;
           
this->setOutlineColor( sf::Color( min( 255,( this->ncoll ) * 50 ), 0, 0, 255 ) );
           
target.setOutlineColor( sf::Color( min( 255,( target.ncoll ) * 50 ), 0, 0, 255 ) );
           
mr =( this->getRadius() + target.getRadius() - mr ) / 2.0;
           
if( this->getPosition().x < target.getPosition().x ) {
               
this->x = -( float )( this->speed ); target.x = target.speed;
               
this->move( - mr, 0 ); target.move( mr, 0 );
           
}
           
else {
               
this->x = this->speed; target.x = -( float )( target.speed );
               
this->move( mr, 0 ); target.move( - mr, 0 );
           
}
           
return true;
       
}
       
return false;
   
}
   
   
float xdown() {
       
if( this->x == 0 || abs( this->x ) < 0.4 ) { return this->x = 0; }
       
else if( this->x < 0 ) { this->x += 0.2; return this->x; }
       
else if( this->x > 0 ) { this->x -= 0.2; return this->x; }
       
else return 0;
       
   
}
}
;




int main() {
   
srand( time( NULL ) ); setlocale( LC_ALL, "" );
   
startConsole();
   
sf::RenderWindow W;
   
createMyWindow( W, "Kolizje" );
   
setSFMLWindow( W.getSystemHandle() );
   
   
vector < Trash > Rain;
   
Rain.reserve( 250 );
   
sf::Texture * tex = new sf::Texture;
   
tex->loadFromFile( "flake.png" );
   
sf::Clock clock;
   
sf::Event e;
   
   
Trash first( 30, clock );
   
first.setFillColor( sf::Color( 0x000000ff ) );
   
first.setPosition( SCREENX / 2, SCREENY / 2 );
   
first.undestructable = true;
   
first.followMouse = true;
   
first.speed = 1;
   
   
Rain.push_back( first );
   
   
unsigned long long int steps = 0;
   
while( W.isOpen() ) {
       
steps++;
       
while( W.pollEvent( e ) ) {
           
if( e.type == sf::Event::Closed ||( sf::Keyboard::isKeyPressed( sf::Keyboard::Escape ) ) ) W.close();
           
       
}
       
W.clear( sf::Color( 0xffffffff ) );
       
if( !( steps % 3 ) ) {
           
Trash n( 12, clock );
           
n.setTexture( tex );
           
n.setPosition( rand() % SCREENX + 1, -( rand() % 40 ) );
           
Rain.push_back( n );
       
}
       
if( Rain.size() )
       
for( auto k = Rain.begin(); k != Rain.end(); k++ )
       
{
           
           
if( k->followMouse && sf::Mouse::isButtonPressed( sf::Mouse::Left ) )
               
 k->move(( - k->getPosition().x + sf::Mouse::getPosition().x ) / 5,( - k->getPosition().y + sf::Mouse::getPosition().y ) / 5 );
           
else
               
 k->move( k->xdown(), k->speed );
           
           
k->rotate( k->rot );
           
           
for( auto m = Rain.begin(); m != Rain.end(); m++ )
           
{
               
if( k == m ) continue;
               
               
k->isCollision2( * m );
           
}
           
           
W.draw( * k );
           
           
           
if( !k->undestructable &&
            ((
k->ncoll >= 10 ) ||( clock.getElapsedTime().asMilliseconds() - k->start.asMilliseconds() > k->cooldown.asMilliseconds() ) ) ) {
               
Rain.erase( k );
               
k--;
           
}
        }
       
W.display();
   
}
   
   
return 0;
}
P-179009
pekfos
» 2021-10-12 17:54:11
C/C++
if( !( steps % 3 ) ) {
   
Trash n( 12, clock );
   
n.setTexture( tex );
   
n.setPosition( rand() % SCREENX + 1, -( rand() % 40 ) );
   
Rain.push_back( n );
}
Obiekt n jest zmienną lokalną, będzie zniszczony po wyjściu z tego bloku. Wcześniej jego kopia jest zapisywana w wektorze.

C/C++
sf::Texture * tex = new sf::Texture;
Nie musisz alokować obiektu dynamicznie tylko dlatego że potrzebujesz gdzieś wskaźnika na obiekt. Możesz przekazać adres zwykłej zmiennej.
C/C++
sf::Texture tex;
//..
n.setTexture( & tex );
P-179014
« 1 » 2
  Strona 1 z 2 Następna strona