2015-09-06 4 views
-1

Ввод представляет собой 2D-матрицу размера n и содержит все значения от 1 до N, то есть каждое значение от 1 до N^2 происходит ровно один раз в матрице. Я пытаюсь сохранить значение индекса ввода (от 1 до n * n), используя векторную пару в местоположении n в векторе.std :: vector :: insert дает неожиданный результат

#include <iostream> 
#include<vector> 
using namespace std; 

int main() { 
    int n; 
    cin>>n; 
    int a[n][n]; 
    vector<pair<int,int> > v(n*n); 
    for(int i=0;i<n;i++){ 
     for(int j=0;j<n;j++){ 
      cin>>a[i][j]; 
     } 
    } 
    for(int i=0;i<n;i++){ 
     for(int j=0;j<n;j++){ 
      v.insert(v.begin()+a[i][j]-1, make_pair(i+1,j+1)); 
     } 
    } 
    for(int i=0;i<n*n;i++) 
     cout<<v[i].first<<" "<<v[i].second<<endl; 

    return 0; 
} 

input: 3 
     1 7 9 
     2 4 8 
     3 6 5 
output:1 1 
     2 1 
     3 1 
     0 0 
     3 3 
     2 2 
     3 2 
     0 0 
     0 0 
expected output:1 1 
       2 1 
       3 1 
       2 2 
       3 3 
       3 2 
       1 2 
       2 3 
       1 3 

Получение неожиданного выхода после первой итерации внутреннего цикла.

+0

Это не C++, это скорее всего gnu-C++ с расширением VLA (http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html). – nwp

+0

Лучшее представление матрицы с 'std :: vector', вероятно,' std :: vector > '. –

+0

Если я понимаю, что вы пытаетесь сделать (что я не могу), вам не придется использовать итераторы. Просто сделайте немного простой математики с i, j и [i] [j]. – Aderis

ответ

1

Написав vector<pair<int,int> > v(n*n);, ваш вектор уже имеет n * n записей. Когда вы вызываете v.insert, вы добавляете еще одну в указанную позицию и смещаете все остальные векторные элементы вправо. Теперь ваш вектор имеет 2 * n * n записей (вы можете попробовать распечатать их все - или просто распечатать size()).

Вы должны изменить эту строку в

v[a[i][j]-1] = make_pair(i+1,j+1); 

Или, как это было предложено M.M, вы можете использовать

v.at(a[i][j]-1) = make_pair(i+1,j+1); 

, который генерирует исключение out_of_range, когда аргумент выходит за пределы. Это, конечно, более безопасное решение.

+1

Предложите использовать 'v.at()' или другую проверку, чтобы избежать вычеркивания границ вектора в случае плохого ввода. –

Смежные вопросы