C++ 尝试交换向量中的两个元素时,断言失败
我有以下代码:C++ 尝试交换向量中的两个元素时,断言失败,c++,vector,C++,Vector,我有以下代码: #include <fstream> #include <iostream> #include <string> #include <vector> #include <stdint.h> std::vector<std::string> readIn(const std::string& fileName) { std::vector<std::string> strVec;
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <stdint.h>
std::vector<std::string> readIn(const std::string& fileName)
{
std::vector<std::string> strVec;
std::ifstream file(fileName);
std::string line;
while (!file.eof())
{
file >> line;
strVec.push_back(line);
}
file.close();
return strVec;
}
void sortVector(std::vector<std::string>& strVec)
{
size_t size = strVec.size();
for (size_t j = 4; j >= 0; j--)
{
for (size_t i = 0; i < size; i++)
{
for (size_t k = i; strVec[k][j] > strVec[k + 1][j]; k++)
strVec[k].swap(strVec[k+1]); //CRASHES HERE
}
}
}
int main()
{
std::string fileName = "input.txt";
std::vector<std::string> strVec = readIn(fileName);
size_t size = strVec.size();
std::cout << "Words in file:" << std::endl
<< "before sorting:";
for (size_t i = 0; i < size; i++)
std::cout << strVec[i] << " ";
sortVector(strVec);
std::cout << std::endl << std::endl << "after sorting:" << std::endl;
for (size_t i = 0; i < size; i++)
std::cout << strVec[i] << std::endl;
return 0;
}
我看到的一个问题是,您没有任何检查来确保您没有访问超出边界的向量 改变
for (size_t k = i; strVec[k][j] > strVec[k + 1][j]; k++)
strVec[k].swap(strVec[k+1]);
到
for(size_t k=i;kstrVec[k+1][j];k++)
strVec[k].swap(strVec[k+1]);
由于您正在访问strVec[k+1]
,k
必须小于size-1
如果
size
为0
,则会出现问题。您可以通过使用int
forsize
和k
而不是size\u t
来解决这个问题,为什么不使用std:sort()
?@HappyCoder这实际上非常有用,尽管我想知道为什么会遇到这个错误。for(size\t j=4;j>=0;j--)
这将永远不会终止,但不会解决问题:/@Larrimus,你能发布你看到问题所在的最小输入吗?这里有一个指向我输入文件的dropbox链接:文件是否太大,无法将其内容添加到你的帖子中?如果没有,请将其内容添加到帖子中。如果不是,请尝试创建仍然会产生问题的文件的最低版本。我们不喜欢问答中包含数据的重要内容的外部链接。
for (size_t k = i; strVec[k][j] > strVec[k + 1][j]; k++)
strVec[k].swap(strVec[k+1]);
for (size_t k = i; k < size-1 && strVec[k][j] > strVec[k + 1][j]; k++)
strVec[k].swap(strVec[k+1]);