-1

我应该使用函数做一个代码,在询问用户输入后,将数字放在向量之前,如下所示:如果向量是 11,12,13,14 新向量是 1 11 2 12 3 13 4 14 直到向量完成然后我必须打印它,但我得到一个矢量下标超出范围的错误,感谢任何帮助。这是我的代码

#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");

}
4

3 回答 3

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,我建议使用 for-each 循环来打印向量,并在声明迭代器时使用 auto 关键字
于 2013-10-11T05:37:12.047 回答
1

我想有一个错字:你应该删除最后;一个for(cuenta=0;cuenta<imprimir.size();cuenta++);

编辑:正如 jrd1 所指出的,你在所有的 for 和 while 循环中都有这个错字......

于 2013-10-11T04:51:35.407 回答
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(就像我一样)具有为此目的明确设计的功能(在两端插入操作)。

虽然,我会说您的代码逻辑有时非常令人费解:即 in ,如果您甚至不使用它arma_vector,为什么要传递值?contador你可以i改用...

于 2013-10-11T05:23:02.600 回答