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

Jak obrócić zawartość wektora lub tablicy o 90°.

Ostatnio zmodyfikowano 2022-10-18 17:46
Autor Wiadomość
AP1994
Temat założony przez niniejszego użytkownika
Jak obrócić zawartość wektora lub tablicy o 90°.
» 2022-10-15 20:14:03
Przykładowy kod:
C/C++
#include <iostream>
#include <vector>
using namespace std;

int main()
{
   
vector < vector < int >> mapa =
   
{
        {
1, 0, 0 },
       
{ 1, 0, 0 },
       
{ 1, 0, 0 }
    }
;
   
for( int i = 0; i <( int ) mapa.size(); i++ )
   
{
       
for( int j = 0; j <( int ) mapa[ i ].size(); j++ )
       
{
           
cout << mapa[ i ][ j ];
       
}
       
if( i <( int ) mapa.size() )
       
{
           
cout << endl;
       
}
    }
   
return 0;
}
jak sprawić aby vector mapa obrócił się w taki sposób aby przyjął wartości:
C/C++
mapa =
{
    {
0, 0, 0 },
   
{ 0, 0, 0 },
   
{ 1, 1, 1 }
}
;
P-179718
pekfos
» 2022-10-15 22:44:12
Skopiuj dane do drugiego wektora we właściwe miejsca. Obrócone pozycje można łatwo obliczyć. Pierwszą kolumnę kopiujesz do ostatniego wiersza, drugą kolumnę do przedostatniego wiersza itd.
P-179719
AP1994
Temat założony przez niniejszego użytkownika
» 2022-10-16 10:54:22
Kod przykładowy miał tylko pokazać, co chcę uzyskać.
Skopiuj dane do drugiego wektora we właściwe miejsca.
Dla dużych wektorów modyfikowanych w trakcie działania programu mija się to z celem.
P-179720
pekfos
» 2022-10-16 14:17:38
Możesz nadpisywać wektor źródłowy, ale będziesz musiał przenosić do 4 elementów naraz żeby nie stracić żadnych wartości.
P-179721
AP1994
Temat założony przez niniejszego użytkownika
» 2022-10-16 23:39:04
udało mi się napisać 2 wersje funkcji vector<vector<int>> vector_rotate(vector<vector<int>> v)
C/C++
//Pierwsza napisana funkcja
vector < vector < int >> vector_rotate( vector < vector < int >> v ) //Zwraca kopię wektora
{
   
vector < int > tmp;
   
vector < vector < int >> m;
   
for( int i = 0; i <( int ) v.size(); i++ )
   
{
       
for( int j = 0; j <( int ) v[ i ].size(); j++ )
       
{
           
tmp.push_back( v[ i ][ j ] );
       
}
       
m.push_back( tmp );
       
tmp.clear();
   
}
   
return m;
}
/*druga napisana funkcja
wykonuje rotacje zawartości:
10000
10000
10000
10000
10000
na:
11111
00000
00000
00000
00000
*/
vector < vector < int >> vector_rotate( vector < vector < int >> v )
{
   
vector < int > tmp;
   
vector < vector < int >> m;
   
for( int j = 0; j <( int ) v[ 0 ].size(); j++ )
   
{
       
for( int i = 0; i <( int ) v.size(); i++ )
       
{
           
tmp.push_back( v[ i ][ j ] );
       
}
       
m.push_back( tmp );
       
tmp.clear();
   
}
   
return m;
}
Niestety i tak nie osiągnąłem zamierzonego efektu, czyli z wektora o zawartości:
10000
10000
10000
10000
10000
zrobić wektor:
00000
00000
00000
00000
11111
P-179724
nanoant20
» 2022-10-17 14:31:18
C/C++
#include <iostream>
#include <algorithm>            
// std::sort
#include <vector>                // std::vector
#include <algorithm>             // std::rotate

using namespace std;

template < typename T >
void print( T & v )
{
   
for( const auto & row: v ) {
       
for( const auto & col: row ) {
           
cout << col << " ";
       
}
       
cout << "\n";
   
}
   
cout << "\n";
}

template < typename T >
T vector_rotate( T & v )
{
   
if( v.size() == 0 )
       
 return v;
   
   
vector < vector < int >> tmp( v[ 0 ].size(), vector < int >() );
   
   
for( size_t i = 0; i < v.size(); ++i )
   
for( size_t j = 0; j < v[ i ].size(); ++j )
       
 tmp[ j ].push_back( v[ i ][ j ] );
   
   
for( size_t i = 0; i < tmp.size() - 1; ++i )
       
 std::rotate( tmp.rbegin(), tmp.rbegin() + 1, tmp.rend() );
   
   
v = tmp;
   
return v;
}

auto main()->int
{
   
vector < vector < int >> mapa =
   
{
        {
1, 0, 0, 0, 0 },
       
{ 1, 0, 0, 0, 0 },
       
{ 1, 0, 0, 0, 0 },
       
{ 1, 0, 0, 0, 0 },
       
{ 1, 0, 0, 0, 0 },
       
{ 1, 0, 0, 0, 0 }
    }
;
   
print( mapa );
   
vector_rotate( mapa );
   
cout << "\n";
   
print( mapa );
   
return 0;
}
P-179726
AP1994
Temat założony przez niniejszego użytkownika
» 2022-10-18 17:46:59
Dziękuję, funkcja napisana przez nanoant20 działa świetnie.
C/C++
template < typename T >
T vector_rotate( T & v )
{
   
if( v.size() == 0 )
       
 return v;
   
   
vector < vector < int >> tmp( v[ 0 ].size(), vector < int >() );
   
   
for( size_t i = 0; i < v.size(); ++i )
   
for( size_t j = 0; j < v[ i ].size(); ++j )
       
 tmp[ j ].push_back( v[ i ][ j ] );
   
   
for( size_t i = 0; i < tmp.size() - 1; ++i )
       
 std::rotate( tmp.rbegin(), tmp.rbegin() + 1, tmp.rend() );
   
   
v = tmp;
   
return v;
}
P-179733
« 1 »
  Strona 1 z 1