2013-10-11 70 views
-1

我supossed做一個代碼使用功能,要求用戶輸入後,像這樣的向量放置數字: 如果向量是11,12,13,14 新矢量是1 11 2 12 3 13 4 14直到向量完成,然後我必須打印它,但我得到了一個向量下標超出範圍的錯誤,aprecciate任何幫助。 這裏是我的代碼代碼失敗插入數字之前的數據的矢量

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

vector<double> llena_vector(int x,vector<double> ingreso) 
{ 
cout<<"Ingrese numeros: "; 
while(cin>>x); 
ingreso.push_back(x); 
    return ingreso; 

} 
vector<double> arma_vector(int contador,vector<double> intercalado) 

{ 
int i=0; 
for(contador=1;contador< intercalado.size()+1;contador++);{ 
    intercalado.insert(intercalado.begin()+i,contador);i++;} 
return intercalado; 
} 

vector<double> imprime_vector(int cuenta,vector<double> imprimir) 

{ 
for(cuenta=0;cuenta<imprimir.size();cuenta++); 
cout<<imprimir[cuenta]<<" "; 
return imprimir; 
} 

int main() 
{ 
int y=0; 
int q=0; 
int w=0; 
int f=0; 
vector<double> usuario; 
vector<double> guardar; 
vector<double> resultado; 
vector<double> print; 
guardar= llena_vector(y,usuario); 
resultado=arma_vector(q,guardar); 
print=imprime_vector(w,resultado); 
system("pause"); 

} 

回答

2

這是一個清潔版本的代碼,在工作條件下。

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

void fill_vector(vector<double>& v) 
{ 
    cout << "Enter 5 numbers." << endl; 
    for (int i = 0; i < 5; ++i) 
    { 
    double d; 
    cin >> d; 
    v.push_back(d); 
    } 
} 

void insert_count(vector<double>& v) 
{ 
    size_t size = v.size(); 
    for (size_t i = 0, j = 0; i < size; ++i, j += 2) 
    { 
    vector<double>::iterator pos = v.begin() + j; 
    v.insert(pos, i + 1); 
    } 
} 

void print_vector(vector<double>& v) 
{ 
    for (size_t i = 0; i < v.size(); ++i) 
    cout << v[i] << " "; 
    cout << endl; 
} 

int main() 
{ 
    vector<double> v; 
    fill_vector(v); 
    insert_count(v); 
    print_vector(v); 
} 

與其他人一樣(可能)指出:

  • 你並不需要按值傳遞(你基本上繞過一堆副本),您可以通過引用傳遞,而不是以減少開銷,並加快速度
  • 你不應該把分號(;)直接在循環語句
  • size_t落後於大小
  • 循環時往往比 int更好
  • 您包含<string>時,它不被使用
  • 您傳遞不需要的參數(例如,一個計數器)
  • 您使用了一個用於用戶輸入的while循環,但它只適用於管道數據,否則它將永遠循環;已知計數的for循環更適合用戶輸入
  • 在現有元素之間插入數字的功能出錯,您錯誤地計算了要插入的位置
  • 您的代碼格式變得混亂,使代碼非常難讀
  • 你不應該污染命名空間(即using namespace std),但我離開它是因爲它是常見的示例代碼
  • 如果你使用C++ 11,我建議使用一個換用於打印矢量的每個循環以及聲明迭代器時的auto關鍵字
1

我想有一個錯字:你應該在for(cuenta=0;cuenta<imprimir.size();cuenta++);

編輯刪除最後一個;:由jrd1如指出,你有這個錯字在你所有的和while循環。 ..

+1

你沒有抓住他們所有人...... – jrd1

+0

@ jrd1確實... – lolando

+0

有錯別字,但它仍然站在^ Z.感謝您的幫助 – davidirhs

1

首先,你的代碼有很多問題。但是,我已將其修改爲與原始文件類似。

#include <iostream> 
#include <string> 
#include <deque> 
#include <cstdlib> 
using namespace std; 

deque<double> llena_deque(int x, deque<double> ingreso) 
{ 
    cout<<"Ingrese numeros: "; 
    while(cin>>x) 
     ingreso.push_back(x); 
    return ingreso; 
} 

deque<double> arma_deque(int contador, deque<double> intercalado) 
{ 
    int size = intercalado.size()+1; 

    for(int i=1; i < size; ++i) { 
     cout << i << endl; 
     intercalado.push_front(i); 
    } 
    return intercalado; 
} 

deque<double> imprime_deque(int cuenta, deque<double> imprimir) 
{ 
    for(cuenta=0;cuenta<imprimir.size();cuenta++) 
     cout << imprimir[cuenta] << " "; 

    return imprimir; 
} 

int main() 
{ 
    int y=0; 
    int q=0; 
    int w=0; 
    int f=0; 
    deque<double> usuario; 
    deque<double> guardar; 
    deque<double> resultado; 
    deque<double> print; 

    guardar= llena_deque(y,usuario); 
    resultado=arma_deque(q,guardar); 
    print=imprime_deque(w,resultado); 

    return 0; 
} 
  • 你所有的循環在他們結束了;。這就是爲什麼你會得到你的錯誤的原因之一,因爲分號終止了一個語句 - 因此,你的循環從來沒有真正訪問過載體,這就是爲什麼你得到了內存訪問違規。
  • 您正在通過價值傳遞所有內存(可能會很慢)。考慮使用引用。
  • 您的操作表明您經常需要不斷向您的媒介推送新數據。如果是這樣,那麼使用deque(正如我所做的那樣),因爲它具有爲此目的而明確設計的功能(在兩端插入操作)。

雖然,我會說,你的代碼的邏輯頗令人費解的時間:即在arma_vector,爲什麼合格contador的價值,如果你甚至不使用它呢?你可以用i代替...