尝试在向量中交换两个元素时断言失败

时间:2016-01-08 05:39:43

标签: 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;
    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;
}

我遇到的问题是将字符串排序为矢量。更具体地说,该程序在我的strVec[k].swap(strVec[k+1]);函数中不喜欢sortVector()。调试器还说我的vector正确填充:
enter image description here
因此,readIn() <{>}} {{}}

也许我不应该这么快就放弃,但我已经用Google搜索并阅读了关于向量(以及向量中的字符串)的所有内容,而且我仍然难以接受。你们给予的任何反馈都将非常感激。

编辑:这是我sortVector()文件的内容:

input.txt

1 个答案:

答案 0 :(得分:2)

我看到的一个问题是你没有任何检查以确保你没有访问超出范围的向量。

更改

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]);

由于您要访问strVec[k+1]k必须小于size-1

如果size0,则会导致问题。您可以使用int sizek代替size_t来解决该问题。