Привет, у меня есть массив, и я надеюсь получить топ-5 наиболее часто встречающихся из этого массива.
static std::string pickRandomStockSymbol()
{
static std::string stockSymbols[] = {"SIRI", "INTC", "ZNGA", "BBRY", "MSFT",
"QQQ", "CSCO", "FB", "MU", "DELL", "AMAT", "NWSA", "AAPL", "AFFY", "ORCL",
"YHOO", "GRPN", "MDLZ", "VOD", "CMCSA" };
return stockSymbols[rand() % 20];
^^ это массив, который я буду использовать.
транзакции создаются случайным образом с использованием этой структуры:
struct Transaction
{
string stockSymbol; // String containing the stock symbol, e.g. "AAPL"string buyerName; // String containing the buyer's name e.g. "Mr Brown"int buyerAccount; // Integer containing an eight digit account code
int numShares; // Integer containing the number of sold shares
int pricePerShare; // Integer containing the buy price per share
};
именно в этой функции я планирую сделать это, я просто не знаю, как я к этому подхожу:
string* Analyser::topFiveStocks()
{
return new string[5];
}
есть ли кто-нибудь, кто хочет показать мне, как я могу пройти через транзакции, чтобы получить эти 5 лучших элементов?
если потребуется дополнительная информация, я буду более чем рад предоставить.
Заранее спасибо, Андрей
Вы могли бы использовать std::unordered_map
с символом акции в качестве ключа и счет транзакции в качестве значения. Затем просто поместите пять самых высоких в std::vector
и верни это.
Что касается размещения верхнего N в векторе, вы могли бы сохранить его отсортированным и пересортировать его после каждой вставки, чтобы запас с наибольшим количеством транзакций был первым. Тогда легко увидеть, имеет ли текущий запас при итерации по карте большее количество транзакций, чем последний элемент в векторе (который является элементом в векторе с наименьшим количеством транзакций), затем добавьте его в вектор и повторно сортировать это.
Вы также можете просто добавить все акции с карты в вектор, а затем отсортировать их по значению на карте и получить первые пять записей в векторе.
Это может быть что-то вроде этого:
using transaction_map_type = std::unordered_map<std::string, unsigned int>;
transaction_map_type transactions;
// ...
std::vector<std::string> topFiveStocks()
{
std::vector<transaction_map_type::value_type> all_trans;
// Copy all transaction into our vector
std::copy(std::begin(transactions), std::end(transactions),
std::back_inserter(all_trans));
// Now sort the transactions
std::sort(std::begin(all_trans), std::end(all_trans),
[](const transaction_map_type::value_type& t1,
const transaction_map_type::value_type& t2)
{ return t1.second > t2.second; });
// And get the top five (or less) results into a separate vector
std::vector<std::string> top_five;
auto count = std::min(5UL, all_trans.size());
for (unsigned i = 0; i < count; i++)
top_five.push_back(all_trans[i].first);
return top_five;
}
Также не забывайте увеличивать счетчик для транзакций на карте всякий раз, когда вы делаете транзакцию.
Замечания: Это решение не проверено, просто написано в браузере. Может даже не скомпилировать.
Просто отсортируйте массив и затем зациклите его, чтобы вычислить самый длинный интервал элементов, которые равны.
Накопить биржевые символы:
map<string, int>
set<string>
int
string