Я пытаюсь присвоить значения массива для вектора. Кажется, что он работает нормально для одного вектора, но когда я делаю это на секунду, я получаю обратно значения мусора. Я присматриваюсь к номеру и знаю, что он правильный, но он не назначается правильно. Я не понимаю, потому что это хорошо работает для первого вектора.
int sorted[] = {0,1,2,3,4,5,6,7,8,9,10};
// make two smaller arrays, do this untill they are a base case size;
void split(int *dataIN, int dataSize){
// new data will be broken up into two vectors with each half of the
// original array. These will be size firstHalfSize and secondHalfSize.
int firstHalfSize;
int secondHalfSize;
vector<int> firstHalf;
vector<int> secondHalf;
// test to see if array in is odd or even
bool isOdd;
if (dataSize%2 == 1){
isOdd = true;
}else if (dataSize%2 == 0){
isOdd = false;
}
// determine length of new vectors
// second half is firstHalf + 1 if odd.
firstHalfSize = dataSize/2;
if (isOdd){
secondHalfSize = firstHalfSize + 1;
}else if (!isOdd){
secondHalfSize = firstHalfSize;
}
// assign first half of dataIn[] to firstHalf vector
cout << "firs: " << firstHalfSize << endl;
for (int i = 0; i < firstHalfSize; i++){
cout << "a: " << dataIN[i] << endl;// make sure i have the right number
firstHalf.push_back(dataIN[i]);// assign
cout << "v: " << firstHalf[i] << endl;// make sure assigned correctly
}
// do the same for second half
cout << "second: " << secondHalfSize << endl;
for (int i = firstHalfSize; i < (firstHalfSize+secondHalfSize); i++){
cout << "a: " << dataIN[i] << endl;
secondHalf.push_back(dataIN[i]);
cout << "v: " << secondHalf[i] << endl;
}
}int main(void){
split(sorted, sizeof(sorted)/sizeof(int));
return 0;
}
Это мой результат. Как видите, первый вектор push_back прошел нормально, и значения массива (после «a:») также верны.
firs: 5
a: 0
v: 0
a: 1
v: 1
a: 2
v: 2
a: 3
v: 3
a: 4
v: 4
second: 6
a: 5
v: -805306368
a: 6
v: 2
a: 7
v: -805306368
a: 8
v: 0
a: 9
v: 0
a: 10
v: 0
Во втором случае вы индексируете из firstHalfSize.
Вам нужно рассчитать значения, начиная с индекса 0. Например:
cout << "v: " << secondHalf[i-firstHalfSize] << endl;
Вы перебираете firstHalf
от 0 до firstHalfSize с переменной i
, так i
будет в пределах диапазона firstHalf
когда вы используете operator[]
— во втором векторном случае, i
не означает то же самое.
Заполнение vector
работает. Это просто ваш отладочный вывод, который является неправильным. При выводе значений из secondHalf
вам нужно использовать индексы от 0, а не от firstHalfSize.
Вы можете написать свой код проще, если воспользуетесь преимуществами std::vector
конструктор диапазона это занимает пару итераторов. Указатели на массивы можно рассматривать как итераторы:
void print(const std::vector<int>& data){
for(int value : data)
std::cout << value << " ";
std::cout << "\n";
}
void split(int *dataIN, int dataSize){
auto firstHalfSize = (dataSize + 1) / 2;
std::vector<int> firstHalf(dataIN, dataIN + firstHalfSize);
std::vector<int> secondHalf(dataIN + firstHalfSize, dataIN + dataSize);
std::cout << "firstHalf: ";
print(firstHalf);
std::cout << "seconHalf: ";
print(secondHalf);
}