我不断对以下代码进行段错误!谁能解释一下发生了什么?
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string line;
getline(cin, line, '\n');
istringstream iss(line);
vector<string> result;
for(string token; getline(iss, token, ' '); )
{
//if(token.empty()) continue;
result.push_back(token); // << Segfaults here
}
for(int i = result.size()-1; i>=0; i++)
{
cout << result[i] << ' ';
}
return 0;
}
答案 0 :(得分:10)
for(int i = result.size()-1; i>=0; i++){
你的循环没有停止。
也许你想要:
for(int i = result.size()-1; i >= 0; i--)
或者,更好的是:
for(auto i = result.rbegin(); i!= rend(); i++) {
cout << *i << ' ';
}
答案 1 :(得分:2)
我会考虑使用boost::adaptors::reverse
#include <vector>
#include <iostream>
#include <boost/range/adaptor/reversed.hpp>
int main()
{
std::vector<int> x {1,2,3};
for (const auto& i : boost::adaptors::reverse(x))
{
std::cout << i << std::endl;
}
}
答案 2 :(得分:2)
正如之前的答案中已经指出的那样,您在此处遇到索引检查问题i>=0
:
for(int i = result.size()-1; i>=0; i++)
但是,我想指出您可以提高代码的&#34;语义级别&#34; (并避免上面的错误),使用< strong>反向迭代器,例如:
for (auto it = result.rbegin(); it != result.rend(); ++it)
请注意,使用这样的代码,您可以向代码阅读器/维护者明确表示您的意图是以 reverse 顺序遍历向量(使用 rbegin()
和 rend()
)。
可编辑的示例代码跟随(live here):
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> result{ "Hello", "World", "123" };
for (auto it = result.rbegin(); it != result.rend(); ++it)
{
cout << *it << ' ';
}
}
<强>输出:强>
123 World Hello