[英]C++ vector<string> segfaults
我繼續在以下代碼上遇到段錯誤! 誰能解釋發生了什么事?
#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;
}
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 << ' ';
}
我會考慮使用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;
}
}
正如之前的答案中指出的那樣,索引檢查i>=0
在這里存在問題:
for(int i = result.size()-1; i>=0; i++)
但是,我想指出的是,您可以使用反向迭代器來提高代碼的“語義級別” (並避免出現上述錯誤),例如:
for (auto it = result.rbegin(); it != result.rend(); ++it)
請注意,使用類似這樣的代碼,您可以使代碼閱讀器/維護人員清楚地知道,您的意圖是以相反的順序遍歷向量(使用rbegin()
和rend()
)。
以下是可編譯的示例代碼 ( 在此處直播 ):
#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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.