为什么此代码会给出Vector超出范围错误?

时间:2019-04-04 23:08:46

标签: c++

所以我有这段代码在尝试反转字符串向量(我知道有更好的方法,这是项目的一部分)。我收到矢量超出范围的错误(我猜是它发生在函数循环部分),我应该做些什么更改才能正确运行此代码?

//reversing a string

#include <iostream>
#include <vector>

typedef std::vector<std::string> strvector;
strvector reverse (strvector &vec);

int main()
{
 strvector string;
 std::string a;
 std::cout << "Enter strings type esc to stop" << '\n';
 while (true)
 {
   std::cin >> a;
   if (a=="esc")
   break;
   string.push_back(a);
 }
 strvector reversed = reverse(string);
 std::cout << reversed.size();
  for (auto i:reversed)
  std::cout << ":" << i << ":" ;
}

//===-===-===-Functions-===-===-===//


strvector reverse (strvector &vec)
{   
 std::string temp;
 for (int i =0;i<vec.size();i++)
 {
    temp = vec.at(i);
    vec.at(i)=vec.at(i+1);
    vec.at(i+1)=temp;
 }
 return vec;
}

1 个答案:

答案 0 :(得分:1)

此行:

vec.at(i)=vec.at(i+1);

访问末尾的元素。将+1添加到已经到向量末尾的索引不是一个好主意:-)

此外,反向函数按引用传递,然后返回按引用传递的向量。做一个或另一个可能很好。

此反向函数使用rbegin()和rend()初始化新向量。

最后,我发现如果我使用getline(cin,input_line),则可以避免在尝试将数据直接读入变量时遇到的许多错误。您处理的输入案例越多,发现此帮助的可能性就越大。

很抱歉,将typedef更改回std :: vector。我在遵循代码时遇到麻烦,需要以一种可以使它们牢记的方式来命名变量。我尝试避免使用单字符变量名。干得好,祝你好运!

#include <iostream>
#include <vector>


std::vector<std::string>  reverse (std::vector<std::string>  vec)
{
  return std::vector<std::string> (vec.rbegin(), vec.rend());
}

int main()
{
  std::vector<std::string> string_vector;
  std::string input_line;
  std::cout << "Enter strings type esc to stop" << '\n';
  while (std::getline(std::cin, input_line) && input_line != "esc")
  {
    string_vector.push_back(input_line);
  }

  std::vector<std::string>  reversed = reverse(string_vector);
  std::cout << reversed.size();
  for (auto element:reversed)
    std::cout << ":" << element << ":" ;
}