Подтвердить что ты не робот

Инициализация контейнера в С++ 98

Мне нужно построить упорядоченный контейнер (который должен быть итерируем) со следующим правилом:

Если условие истинно, контейнер {1,0}, иначе он {0,1}

У меня есть следующий код, но я не считаю его "элегантным":

   vector<int> orderedSides;
   if (condition) 
   {
       orderedSides.push_back(1);
       orderedSides.push_back(0);
   }
   else            
   {
       orderedSides.push_back(0);
       orderedSides.push_back(1);
   }

Есть ли лучший способ сделать это (с точки зрения соответствия и производительности)?

4b9b3361

Ответ 1

Вы можете реализовать что-то вроде этого:

vector<int> orderedSides(2, 0);
(condition ? orderedSides.front() : orderedSides.back()) = 1;

который немного короче, чем явные, если предложения.

В качестве @Deduplicator, упомянутого ниже, мы можем переписать вторую строку более кратким образом:

orderedSides[!condition] = 1;

Ответ 2

vector<int> orderedSides;
orderedSides.push_back(condition ? 1 : 0);
orderedSides.push_back(condition ? 0 : 1);

Я не думаю, что это более показательно, но я считаю его более элегантным.

Ответ 3

Вы можете пойти на компромисс между эффективностью и избежать повторения, инициализировать первое с условием, а второе - с первого.

vector<int> orderedSides(1, bool(condition)) ;
orderedSides.push_back(!orderedSides.back());

Ответ 4

orderedSides.push_back(0);
orderedSides.push_back(1);
if (condition)
  std::iter_swap(orderedSides.begin(), orderedSides.begin()+1);

Я знаю, что это требует стоимости бит. Как один из кандидатов.

Ответ 5

Вы можете заполнить std::vector из массива, даже в С++ 98.

Вот пример:

#include <iostream>
#include <vector>

int main() {
    bool condition = false;
    std::cout << "condition is: " << std::boolalpha << condition << '\n';

    int arr[][2] = {{0,1}, {1,0}};
    int index = condition;
    std::vector<int> v(arr[index], arr[index]+2);

    for (int i = 0; i < v.size(); i++)
        std::cout << v[i] << ' ';
    std::cout << '\n';
}

Вывод:

$ g++ tt.cc && ./a.out
condition is: false
0 1 

Для справки:

Ответ 6

Если вы создаете элементы (int в своем вопросе, что бы это ни было в реальной жизни) является свободным и побочным эффектом:

static const int data[] = { 0, 1, 0 };
std::vector<int> orderedSides (data+condition, data+condition+2);

Полный пример программы:

#include <iostream>
#include <vector>

std::vector<int> make(bool cond)
{
    static const int data[] = { 0, 1, 0 };
    return std::vector<int> (data+cond, data+cond+2);
}

std::ostream& operator<<(std::ostream& os, const std::vector<int>& v)
{
    return os << "{ " << v[0] << ", " << v[1] << " }";
}    

int main()
{
    std::cout << "true:  " << make(true) << "\n"
              << "false: " << make(false) << "\n";
}

Печать

true:  { 1, 0 }
false: { 0, 1 }

Демо