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

Why does this code give Vector out of range error?

本文关键字:Vector 范围 错误 代码 为什么      更新时间:2023-10-16

所以我有这段代码,我试图反转字符串向量(我知道有更好的方法,这是项目的一部分(。我得到矢量越界错误(我的猜测是它发生在函数循环部分(,我应该进行哪些更改才能正确运行此代码?

//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;
}

这一行:

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

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

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

这个反向函数使用 rbegin(( 和 rend(( 来初始化一个新的向量。

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

很抱歉将 typedefs 改回 std::vectorstd::string。 我在遵循代码时遇到问题,需要以一种我可以记住它们的方式命名变量。 我尽量避免使用单字符变量名称。

#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 << ":" ;
}