Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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++ 为什么std::random_shuffle在std::vector中创建空值?_C++_Vector - Fatal编程技术网

C++ 为什么std::random_shuffle在std::vector中创建空值?

C++ 为什么std::random_shuffle在std::vector中创建空值?,c++,vector,C++,Vector,我想洗牌一个char向量,但我注意到它创建了空值。以下是代码的一部分: vector<char> letters_num; vector<char> shuffle_letters_num; char default_letters_num[88] = {'a','b','c','d','e','f','g','h','i','j','k', 'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', 'A'

我想洗牌一个char向量,但我注意到它创建了空值。以下是代码的一部分:

vector<char> letters_num;
vector<char> shuffle_letters_num;

char default_letters_num[88] = {'a','b','c','d','e','f','g','h','i','j','k',
'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
'P','Q','R','S','T','U','V','W','X','Y','Z',
'0','1','2','3','4','5','6','7','8','9'
};

letters_num.insert(letters_num.begin(),default_letters_num,default_letters_num+88);

shuffle_letters_num=letters_num;
random_shuffle(shuffle_letters_num.begin(),shuffle_letters_num.end());
矢量字母数量;
向量洗牌字母数;
字符默认字母_num[88]={a'、'b'、'c'、'd'、'e'、'f'、'g'、'h'、'i'、'j'、'k',
‘l’、‘m’、‘n’、‘o’、‘p’、‘q’、‘r’、‘s’、‘t’、‘u’、‘v’、‘w’、‘x’、‘y’、‘z’,
‘A’、‘B’、‘C’、‘D’、‘E’、‘F’、‘G’、‘H’、‘I’、‘J’、‘K’、‘L’、‘M’、‘N’、‘O’,
‘P’、‘Q’、‘R’、‘S’、‘T’、‘U’、‘V’、‘W’、‘X’、‘Y’、‘Z’,
'0','1','2','3','4','5','6','7','8','9'
};
字母数插入(字母数开始(),默认字母数,默认字母数+88);
洗牌字母数=字母数;
随机洗牌(洗牌字母数开始(),洗牌字母数结束());
shuffle_letters_num被正确地洗牌,但shuffle_letters_num的大小大于letters_num

因此,当我尝试这样的操作时,迭代器的内容可能是空的:

for(int i = 0; i < size_string; ++i) {
    it=find(shuffle_letters_num.begin(),shuffle_letters_num.end(),string[i]);

    if(it==shuffle_letters_num.end())
    {
        return "";
    }

    if(it==shuffle_letters_num.begin())
    {
        result+=shuffle_letters_num.at(shuffle_letters_num.size()-1);
    }
    else
    {
        it--;
        result += *it;
    }
}
for(int i=0;i
如何在不生成空值的情况下洗牌向量

char default_letters_num[88]
您定义了一个88个字符的数组,但是您只提供了26+26+10=62个初始值设定项,所以最后88-62=16个字符的值为零


只需将两个出现的88替换为62,一切都应按预期工作。

最干净的方法可能是直接初始化向量:

vector<char> letters_num {'a','b','c','d','e','f','g','h','i','j','k',
    'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O',
    'P','Q','R','S','T','U','V','W','X','Y','Z',
    '0','1','2','3','4','5','6','7','8','9'
};

vector<char> shuffle_letters_num {letters_num};

random_shuffle(shuffle_letters_num.begin(),shuffle_letters_num.end());
…此外,还提供了两个函数模板,用于正确查找数组的开头和结尾:

template <class T, size_t N>
T *begin(T (&array)[N]) {
    return array;
}

template <class T, size_t N>
T *end(T (&array)[N]) { 
    return array + N;
}
模板
T*begin(T&数组)[N]){
返回数组;
}
模板
T*end(T(&数组)[N]){
返回数组+N;
}
使用这些函数,从数组初始化向量可能如下所示:

vector<char> shuffle_letters_num (begin(letters_num), end(letters(num));
vector shuffle_-letters_-num(开始(letters_-num),结束(letters(num));

不管是哪种方式,我们已经消除了数组中容易出错的手工计数项,并让编译器为我们这样做(这肯定比我所希望的更好).

FYI,C++17将删除这一超负荷的
std::random_shuffle
。强烈建议使用
std::shuffle
。有26个大写字母,26个小写字母,88-26-26=36位。我说得对吗?…是的,我很愚蠢,我在删除一些字符后忘记了更新数组的大小。谢谢。你应该这样做一开始没有使用硬编码的大小。OP还需要更改
字母数。插入(字母数begin(),默认字母数,默认字母数+88);
或者直接初始化向量,应该使用初始化器列表重载。或者使用
字符默认字母数[]={::]:
sizeof
而不是硬编码大小。。。
vector<char> shuffle_letters_num (begin(letters_num), end(letters(num));