Pomoc przy losowaniu z vektora.

0

Witam, nie wiem jak dzielić vektor w losowym miejscu. Proszę o pomoc.
Dokładnie chodzi o
mamy
2 9 84 9 5 6 25 12
2 98 56 2 54
5 2
8 5 22 5 48 6 1 9 8 7 554 25 235 32
bierzemy

*2 9 * 84 9 5 6 25 12
*8 5 22 5 48 6*  1 9 8 7 554 25 235 32

i dzielimy każdy osobno

*2 9*  1 9 8 7 554 25 235 32
*8 5 22 5 48 6 *84 9 5 6 25 12

Dane pobieram z pliku
po czym wpisuje je do vektora w strukturze

struct osobnik
{
	std::vector<int> allel;
};
void wczytywanie()
{
	std::ifstream plik;
	plik.open("Chromosom.txt");
	if (plik.good() == false) std::cout << "Plki jest umieszczony w zlym folderze, lub nie istnieje";
	std::vector<osobnik> chromosom;
	for (std::string line; getline(plik, line); std::cout << std::endl)
	{
		std::stringstream ss(line);
		chromosom.emplace_back();
		for (int temp; ss >> temp; std::cout << temp << ' ') chromosom.back().allel.push_back(temp);
	}	
	plik.close();
	osobnik x;
	std::cout << "\n\nilosc elementow vektora : " << x.allel.size();
}

I jak mi wiadomo to każda linijka powinna zostać vektorem dzięki czemu będziemy mogli je dzielić i mieszać, ale nie wiem jak dzielić te vektory i mieszać. Proszę o wyjaśnienie jak to zrobić.

1
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;

using genom = vector<int>;
using splited = pair<genom,genom>;

splited split(const genom &src)
{
    static struct once { public: once() { srand(time(0)); } } _once;
    size_t size=src.size();
    if(size<2) exit(1); // a co robimy?
    size_t mid=size>2?1+(rand()%(size-1)):1;
    return make_pair(vector<int>(begin(src)+0,begin(src)+mid),vector<int>(begin(src)+mid,begin(src)+size));
}

int main()
{
	genom src { 1,2,3,4,5,6,7 };
	for(int i=0;i<10;++i)
	{
		splited sp=split(src);
		ostream_iterator<int> sout(cout," ");
		copy_n(begin(sp.first),sp.first.size(),sout);
		cout<<"/ ";
		copy_n(begin(sp.second),sp.second.size(),sout);
		cout<<endl;
	}
	return 0;
}

https://ideone.com/YFPijy

0

Mógłbym prosić o jakieś wyjaśnienie tego kodu?

0
Szymon Mazur napisał(a):

Mógłbym prosić o jakieś wyjaśnienie tego kodu?

Do której instrukcji nie możesz znaleźć dokumentacji z przykładami w google?

1

Innym rozwiązanie jest użycie kontenera std::list<int>, który stworzony został do tego typu zadań tzn. rozdzielaniu i następnie scalaniu danych, robiąc to w krótszym czasie niż w przypadku wektorów.
Zobacz

#include <iostream>
#include <random>
#include <list>

using namespace std;

class RandomInteger
{
public:
    static int get( int min , int max )
    {
        uniform_int_distribution<int> dist {min,max};
        return dist(mt);
    }
private:
    inline static mt19937 mt {random_device{}()};
};

void random_swap( list<int>& A , list<int>& B )
{
     if( A.size()<2 || B.size()<2 ) return;

     auto A_divider = RandomInteger::get(1,A.size()-1);
     auto B_divider = RandomInteger::get(1,B.size()-1);

     list<int> A_splice;
     list<int> B_splice;

     A_splice.splice( A_splice.begin(), A , A.begin(), next(A.begin(),A_divider) );
     B_splice.splice( B_splice.begin(), B , B.begin(), next(B.begin(),B_divider) );

     A.splice( A.end(), B_splice , B_splice.begin(), B_splice.end() );
     B.splice( B.end(), A_splice , A_splice.begin(), A_splice.end() );
}

void printList( const list<int>& data )
{
    for( const auto& element : data )
    {
        cout << element << " ";
    }
    cout << endl;
}

int main()
{
    list<int> list1 = { 1 , 32 , 8 , 12 };
    list<int> list2 = { -1 , 2 , 67 , -232 , -5 , 46 , 7 };

    printList(list1);
    printList(list2);
    cout << endl;

    random_swap(list1,list2);

    printList(list1);
    printList(list2);
}  

https://godbolt.org/z/EWaG7n

1 użytkowników online, w tym zalogowanych: 0, gości: 1