누군가가 말해 줄 수있는 GNU C++ 컴파일러분할 오류 벡터 반복자와 프로그램이 컴파일 및 Visual Studio에서 잘 실행되지만 컴파일 된 세그먼트 오류와 함께 실패하는 이유
내 인생이 알아낼 수 없습니다에 대한 . 나는 접두사/후위 연산자를 살펴보고 iterator가 조건문에 제대로 배치되었는지 확인했습니다 ... 무엇이 누락 되었습니까? 일반적으로 동적 배열 할당/할당 해제 작업을 할 때이 문제가 발생합니다. 여기서는 수행하지 않습니다.
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <random>
#include <unordered_set>
namespace std{
template <>
struct hash<vector<int>> : public unary_function<vector<int>, size_t>
{
size_t operator()(const vector<int>& v) const
{
return v.size();
}
};
}
using namespace std;
struct testCase{
int n;
int m;
vector <int> wordVector;
};
bool lexOrderConfirm(std::vector<int>::const_iterator, std::vector<int>::const_iterator, std::vector<int>::const_iterator, int);
int main() {
int t;
cin>>t;
vector <testCase*> testCaseVector(t);
for (int i = 0; i < t; ++i){
testCaseVector[i] = new testCase;
cin>>testCaseVector[i]->n;
cin>>testCaseVector[i]->m;
}
for (int i = 0; i < t; ++i){
std::unordered_set<std::vector<int>, std::hash<std::vector<int> > >permutations;
int permu = pow((double)testCaseVector[i]->n, testCaseVector[i]->m);
int count = 0;
for (int z= 0; z < (permu*10); ++z){
std::random_device rd;
std::default_random_engine randomeng(rd());
int v;
for (int b = 0; b < testCaseVector[i]->m; ++b){
v= randomeng() % testCaseVector[i]->n + 1; /*random number between 1 and n*/
testCaseVector[i]->wordVector.push_back(v);
}
std::sort(testCaseVector[i]->wordVector.begin(), testCaseVector[i]->wordVector.end());
permutations.insert(testCaseVector[i]->wordVector);
testCaseVector[i]->wordVector.clear();
}
do {
vector <int> test = *permutations.begin();
do {
std::vector<int>::const_iterator start = test.begin();
std::vector<int>::const_iterator end;
end = test.end();
std::vector<int>::const_iterator lastElem = start+(testCaseVector[i]->m-1);
if (lexOrderConfirm(start, end, lastElem, testCaseVector[i]->n)){
++count;
}
}while(std::next_permutation(test.begin(),test.end()));
permutations.erase(permutations.begin());
test.clear();
}while(!permutations.empty());
count = count%100000007;
cout<<count<<endl;
}
return 0;
}
bool lexOrderConfirm(std::vector<int>::const_iterator start, std::vector<int>::const_iterator end, std::vector<int>::const_iterator lastElem, int N){
bool confirmed = true;
for (std::vector<int>::const_iterator t = start; t != end; ++t){
if ((2* (*t) > N)){
} else if ((2*(*t) <= N) && (*(t+1) >= 2 * (*t)) && (t != (lastElem))){
}else{
confirmed = false;
break;
}
}
return confirmed;
}
NULL로 포인터를 초기화 않기 때문에. 또한, 많은 상용구와 형식이 잘못된 코드를 게시했지만 디버거 또는 최소한 오류 메시지에서 추적을 제공하지 않았습니다. 이 경우 아무도 당신을 도울 수 없습니다. 귀하의 질문을 재 설계하십시오. –