#c #std
#c #std
Вопрос:
Я хочу инициализировать вектор буквами алфавита, используя функцию push_back. Правильно ли это сделать?
vector<char> v;
char letter = 'A';
for(int i=0; i<26; i )
{
v.push_back(letter i);
}
Это работает. Мне просто интересно, должен ли я использовать приведенную букву типа к int, прежде чем добавлять к нему i?
Или есть более эффективный способ?
Комментарии:
1. Черт возьми, я бы просто использовал
std::string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
. Добавление целого числа к букве не гарантирует получение следующей буквы.2. @NathanOliver Затем
vector<char>(alphabet.begin(), alphabet.end())
, чтобы получить вектор3. @MikeCAT Вам вообще нужен вектор, когда у вас есть строка?
4. @NathanOliver Это будет зависеть от ситуации, но OP говорит, что он / она хочет инициализировать вектор.
5. @anechkayf Даже это не гарантирует работу. Цифры
0-9
гарантированно будут находиться рядом друг с другом в кодировке. Это означает'2' 2
, что гарантированно будет'4'
. Любой другой символ не имеет такой же гарантии.'C' 1
может быть чем угодно. Это может быть'D'
, это может быть'c'
или что-то еще.
Ответ №1:
Обратите внимание, что ваш код основан на схеме кодирования символов, которая кодирует буквы последовательно, например, ASCII.
Если это предположение верно, вы можете изначально создать вектор, используя правильный размер, и использовать std::iota
для инициализации всех элементов:
std::vector<char> v(26); // Create a vector of 26 (default-initialized) elements
std::iota(begin(v), end(v), 'A'); // Assign a letter to each element in the vector
Если вы хотите, чтобы ваш код был переносимым в системы, где буквы не кодируются последовательно (например, в системе, использующей EBCDIC), тогда вам лучше создать строку, явно используя буквы:
std::string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Thanks Nathan Oliver :)
И если у вас есть строка со всеми буквами, то, возможно, вам даже не понадобится вектор.
Ответ №2:
Выглядит довольно неплохо!
- Я думаю, может
std::array()
быть, это тоже вариант, по сравнению сstd::vector()
аналогичными задачами:
#include <iostream>
#include <array>
#include <vector>
#include <chrono>
void function1() {
std::vector<char> alphabets;
for (unsigned int index = 0; index < 26; index) {
alphabets.push_back(index 'A');
// std::cout << alphabets[index] << "t";
}
// std::cout << "nn";
}
void function2() {
std::vector<char> alphabets;
for (unsigned int index = 0; index < 26; index) {
alphabets.emplace_back(index 'A');
// std::cout << alphabets[index] << "t";
}
// std::cout << "nn";
}
void function3() {
std::array<char, 26> alphabets;
for (unsigned int index = 0; index < 26; index) {
alphabets[index] = index 'A';
// std::cout << alphabets[index] << "t";
}
// std::cout << "nn";
}
int main() {
const auto t1 = std::chrono::high_resolution_clock::now();
for (std::size_t i = 0; i < 1000000; i) {
function1();
}
const auto t2 = std::chrono::high_resolution_clock::now();
const auto duration = std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();
std::cout << duration <<
" is the rough runtime of std::vector function with push_backt💙💙💙t😳nn";
const auto t3 = std::chrono::high_resolution_clock::now();
for (std::size_t i = 0; i < 1000000; i) {
function2();
}
const auto t4 = std::chrono::high_resolution_clock::now();
const auto duration2 = std::chrono::duration_cast<std::chrono::microseconds>( t4 - t3 ).count();
std::cout << duration2 <<
" is the rough runtime of std::vector function with emplace_backt💙💙💙t😳nn";
const auto t5 = std::chrono::high_resolution_clock::now();
for (std::size_t i = 0; i < 1000000; i) {
function3();
}
const auto t6 = std::chrono::high_resolution_clock::now();
const auto duration3 = std::chrono::duration_cast<std::chrono::microseconds>( t6 - t5 ).count();
std::cout << duration3 << " is the rough runtime of std::array functiont💙💙💙t😳nn";
return 0;
};