std::vector.push_back() C

#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;
};