Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么超过了内存限制?_C++_C++11 - Fatal编程技术网

C++ 为什么超过了内存限制?

C++ 为什么超过了内存限制?,c++,c++11,C++,C++11,我在做“按频率排序字符”的问题 为什么会发生这种情况 代码 类解决方案{ 公众: 结构节点{ 国际频率; char ch; }; 静态布尔lambda(结构节点a、结构节点b){ 返回a.freq>b.freq; } 字符串频率排序(字符串s){ 如果(s.size()==0) 返回“”; 字符串res=“”; 向量nums(256); 用于(字符c:s){ nums[(int)c].ch=c; nums[(int)c].freq++; } std::sort(nums.begin()、nums

我在做“按频率排序字符”的问题

为什么会发生这种情况

代码
类解决方案{
公众:
结构节点{
国际频率;
char ch;
};
静态布尔lambda(结构节点a、结构节点b){
返回a.freq>b.freq;
}
字符串频率排序(字符串s){
如果(s.size()==0)
返回“”;
字符串res=“”;
向量nums(256);
用于(字符c:s){
nums[(int)c].ch=c;
nums[(int)c].freq++;
}
std::sort(nums.begin()、nums.end()、Solution::lambda);
字符c;
对于(int i=0;nums[i].freq>0;i++){
c=nums[i].ch;
while(nums[i].freq--){
res=res+c;//如果我用res+=c替换此行,它将被接受!
}
}
返回res;
}
};
string操作符+(string&,string&)
操作符将参数复制到新的string对象中。然后将此临时返回值复制到
res
——这可能还需要复制到新的、更大的缓冲区中。除非启用C++11,否则在这种情况下将使用移动分配,因此避免后一种可能的分配+复制

string&operator+=(conststring&)
不会创建新的字符串对象。它修改现有的字符串缓冲区-除非需要更大的缓冲区,否则无法避免重新分配

因此,
res+=c
避免在动态内存中创建临时缓冲区。如果字符串足够大,将同时使用的拷贝数增加一倍可以使程序的峰值内存使用量增加一倍。另外,额外的临时分配可能会增加动态内存空间的碎片,从而增加动态内存管理的开销。这两个因素可能会导致程序超出给定的内存限制

string操作符+(string&,string&)
操作符将参数复制到新的string对象中。然后将此临时返回值复制到
res
——这可能还需要复制到新的、更大的缓冲区中。除非启用C++11,否则在这种情况下将使用移动分配,因此避免后一种可能的分配+复制

string&operator+=(conststring&)
不会创建新的字符串对象。它修改现有的字符串缓冲区-除非需要更大的缓冲区,否则无法避免重新分配


因此,
res+=c
避免在动态内存中创建临时缓冲区。如果字符串足够大,将同时使用的拷贝数增加一倍可以使程序的峰值内存使用量增加一倍。另外,额外的临时分配可能会增加动态内存空间的碎片,从而增加动态内存管理的开销。这两个因素可能会导致程序超出给定的内存限制。

我们需要足够的代码来复制问题。您了解
res=res+c
res+=c
?如果
char
有符号的
并且如果您得到“扩展”字符作为输入(即编码大于127的字符),则表达式
(int)c
将导致符号扩展,并且您将有一个越界索引。这与您的问题无关,但是如果
char
是有符号的,字符串包含顶部位集的字符,您将在向量外进行索引。您可能还需要考虑使用String::StruteFe()和过载(5),我们需要足够的代码来复制问题。您理解<代码> RES = RES+C之间的区别吗?代码>和
res+=c
?如果
char
有符号的
并且如果您得到“扩展”字符作为输入(即编码大于127的字符),则表达式
(int)c
将导致符号扩展,并且您将有一个越界索引。这与您的问题无关,但是如果
char
是有符号的,字符串包含顶部位集的字符,您将在向量外进行索引。您可能还需要考虑使用String::RealEvo()和过载(5)。
class Solution {

    public:
        struct Node {
            int freq;
            char ch;
        };

        static bool lambda(struct Node a, struct Node b) {
            return a.freq > b.freq;
        }

        string frequencySort(string s) {
            if(s.size() == 0)
                return "";

            string res = "";
            vector<Node> nums(256);

            for(char c : s) {
                nums[(int)c].ch = c;
                nums[(int)c].freq++;
            }

            std::sort(nums.begin(), nums.end(), Solution::lambda);

            char c;
            for(int i=0; nums[i].freq > 0; i++) {
                c = nums[i].ch;
                while(nums[i].freq--) {
                    res = res + c; // If I replace this line with res += c, it gets accepted!
                }
            }

            return res;
        }
};
res = res + c; // If I replace this line with res += c, it gets Accepted!