LINUX.ORG.RU

История изменений

Исправление Aswed, (текущая версия) :

#include <vector>
#include <iostream>

using namespace std;

void moveToB(vector<void*> &a, vector<void*> &b) {
	int n;
	cin >> n;
	for(int i=0; i<n; ++i) {
		b.push_back(a.back());
		a.pop_back();
	}
}

int main(){
	vector<void*> a;
	vector<void*> b;
	int n;
	cin >> n;
	a.push_back((void*)&b);
	for(int i=0; i<n; ++i){
		a.push_back(NULL);
	}
	moveToB(a,b);
	return 0;
}

Циклическая ссылка может возникнуть, а может и не возникнуть. Зависит только от рантайма. Возможны и более сложные случаи, когда a -> b -> c -> a. Это нельзя гарантированно отловить на этапе компиляции. Только если очень сильно урезать возможности программиста, что бы не допустить никакой возможности создания цикла. Но в таком случае ты даже двусвязный список не реализуешь.

Исправление Aswed, :

#include <vector>
#include <iostream>

using namespace std;

void moveToB(vector<void*> &a, vector<void*> &b) {
	int n;
	cin >> n;
	for(int i=0; i<n; ++i) {
		b.push_back(a.back());
		a.pop_back();
	}
}

int main(){
	vector<void*> a;
	vector<void*> b;
	int n;
	cin >> n;
	a.push_back((void*)&b);
	for(int i=0; i<n; ++i){
		a.push_back(NULL);
	}
	moveToB(a,b);
	return 0;
}

Циклическая ссылка может возникнуть, а может и не возникнуть. Зависит только от рантайма. Возможны и более сложные случаи, когда a -> b -> c -> a. Это нельзя гарантированно отловить на этапе компиляции. Только если очень сильно урезать возможности программиста, что бы не допустить никакой возможности создания цикла. Но в таком случае, ты даже двусвязный список не реализуешь.

Исходная версия Aswed, :

#include <vector>
#include <iostream>

using namespace std;

void moveToB(vector<void*> &a, vector<void*> &b) {
	int n;
	cin >> n;
	for(int i=0; i<n; ++i) {
		b.push_back(a.back());
		a.pop_back();
	}
}

int main(){
	vector<void*> a;
	vector<void*> b;
	int n;
	cin >> n;
	a.push_back((void*)&b);
	for(int i=0; i<n; ++i){
		a.push_back(NULL);
	}
	moveToB(a,b);
	return 0;
}

Циклическая ссылка может возникнуть, а может и не возникнуть. Зависит только от рантайма. Возможны и более сложные случаи, когда a -> b -> c -> a. Это нельзя гарантированно отловить на этапе компиляции. Только если очень сильно урезать возможности программиста, что бы не допустить никакой возможности создания цикла.