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