vector怎么可能是返回类型值,还有关于我的代码的另一个问题



下面的代码实现了一个后缀数组算法。

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <string.h>
using namespace std;
/**---  Reference:http://www.geeksforgeeks.org/suffix-array-set-1-introduction/ ---*/
/**
* @brief store the information of suffix
*/
struct suffix
{
int index;
string suff;
};
/**
* @brief get suffix_array
* @param text
* @param n the length of text
*
* ps:
*  b a n a n a
*  5 3 1 0 4 2
*
*  0 banana                          5 a
*  1 anana     Sort the Suffixes     3 ana
*  2 nana      ---------------->     1 anana
*  3 ana        alphabetically       0 banana
*  4 na                              4 na
*  5 a                               2 nana
*
* suffix array for "banana" is {5, 3, 1, 0, 4, 2}
*
* Rank array: the rank array rank[i] represents the rank of the suffix 
*             beginning at the ith position. That is, if suffix_array[i]=j,
*             then rank[j] = i
*
*/
vector<int> buildSuffixArray(string& text, int n)
{
//store suffixes and their indices
struct suffix suffixes[n];
vector<int> suffix_array;
for (int i = 0; i < n; ++ i)
{
suffixes[i].index = i;
suffixes[i].suff = text.c_str() + i;
}
sort(suffixes, suffixes + n, [](struct suffix a, struct suffix b) {
return strcmp(a.suff.c_str(), b.suff.c_str()) < 0 ? 1 : 0;
});
for (int i = 0; i < n; ++ i)
suffix_array[i] = suffixes[i].index;
return suffix_array;
}
vector<int> rankArray(vector<int>& suffix_array)
{
vector<int> rank_array(suffix_array.size());
for (int i = 0; i < suffix_array.size(); i++)
rank_array[suffix_array[i]] = i;
return rank_array;
}

当我将此代码复制到Visual Studio中时,它提醒我表达式必须包含常数值,并且n-->(struct suffix suffixes[n](不能在此位置使用。以下是我的编译器报告的中文错误消息。

表达式必须含有常量值,参数n不可用作常量值

我不明白为什么,我可以用gcc编译它,不会出错。

我不知道vector如何成为返回类型值,有人能给我一些建议吗?

可变长度阵列

我可以通过gcc编译它,不会出错。

在堆栈上创建一个具有自动存储持续时间的数组suffix suffixes[n]。那么这个n通常必须在C++的编译时确定。但一些C++编译器支持VLA(可变长度数组(,它是C99的一个附加项,允许在堆栈上声明长度不恒定的C样式数组。VC++不支持C99和VLA,但GNU编译器支持VLA作为扩展,即使在C90和C++中也是如此。这就是为什么您可以通过gcc编译上述代码而不会出错的原因。过去有各种相关的帖子。

  • 为什么我可以在gcc上声明一个具有预定大小的数组,而不能在visualstudioC++上声明
  • 为什么C/C++编译器在编译时需要知道数组的大小
  • 为什么';可变长度数组是C++标准的一部分吗
  • C++编译器中的可变长度数组(VLA(

如果在gcc编译命令中添加-pedantic(-pedantic-errors(选项,我们可以得到大多数gcc扩展的警告(错误(。在这种情况下,使用此选项,我们应该得到以下警告(错误(消息:

ISO C++禁止可变长度数组"后缀">


buildSuffixArray的实现

我不知道向量如何成为返回类型值

即使在GNU编译器中,您的buildSuffixArray也会出现分段错误,因为suffix_array没有分配。以下最低修复版本将与GNU编译器一起运行

std::vector<int> buildSuffixArray(const std::string& text, int n)
{
suffix suffixes[n];
for (int i = 0; i < n; ++ i)
{        
suffixes[i].index = i;
suffixes[i].suff = text.c_str() + i;
}
std::sort(suffixes, suffixes + n, [](struct suffix a, struct suffix b) {
return std::strcmp(a.suff.c_str(), b.suff.c_str()) < 0 ? 1 : 0;
});
std::vector<int> suffix_array(n);
for (int i = 0; i < n; ++ i){
suffix_array[i] = suffixes[i].index;
}
return suffix_array;
}

但是VC++不支持VLA,并且上面的修复版本仍然显示VC++的编译错误。以下代码是一个避免VLA(、冗余参数n和lambda表达式(的示例。这将适用于gcc和VC++。DEMO来了

std::vector<int> buildSuffixArray(const std::string& text)
{
std::vector<suffix> suffixes(text.length());
for (std::size_t i = 0; i < suffixes.size(); ++i)
{        
suffixes[i].index = i;
suffixes[i].suff = text.c_str() + i;
}
std::sort(suffixes.begin(), suffixes.end(), [](const suffix& a, const suffix& b) {
return (std::strcmp(a.suff.c_str(), b.suff.c_str()) < 0);
});
std::vector<int> suffix_array(text.length());
for (std::size_t i = 0; i < suffix_array.size(); ++i){
suffix_array[i] = suffixes[i].index;
}
return suffix_array;
}

相关内容

最新更新