【发布时间】:2021-12-17 06:52:33
【问题描述】:
我有一个数组:
names[4]={john,david,jack,harry};
我想随机播放,比如:
names[4]={jack,david,john,harry};
我尝试使用它,但它只是打乱了数组中第一个单词的字母:
random_shuffle(names->begin(), names->end());
这是完整的代码,它从 .txt 文件中读取名称并放入一个数组中:
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
ifstream readName("names.txt");
string names[197];
int i = 0;
for (string line; getline(readName, line); ){
readName >> names[i];
i++;
}
readName.close();
random_shuffle(names->begin(), names->end());
for (int i = 0; i < 197; i++) {
cout << names[i] << endl;
}
return 0;
}
我从不同的人那里尝试了一些其他的东西,但我无法成功。任何有帮助的东西,谢谢!
【问题讨论】:
-
std::shuffle()。停止使用random_shuffle();它在 C++17 中被删除。 -
你有什么理由使用 C 风格的数组而不是
std::vector? -
如果你坚持使用 C 数组,那就是
std::begin(names)和#include <iterator>。 -
如果您想知道为什么不应该使用 random_shuffle,请参阅stackoverflow.com/questions/19219726/…
-
正如其他人所说,更喜欢
std::shuffle()而不是std::random_shuffle()(如果使用 C++17 及更高版本)。除此之外,您需要使用合理的迭代器来表示要洗牌的范围。您的代码中的names->begin()和names->end()分别等效于names[0].begin()和names[0].end(),因此您的代码正在改组单个字符串names[0],而不是数组names。用于随机播放names而不是names[0]的迭代器是(C++11 和更高版本)std::begin(names)和std::end(names)或(所有 C++ 版本,包括 C++11 之前的版本)names和names+sizeof(names)/sizeof(*names)