Инициализация вектора прежде основной () в C++

Калькулятор квот API YouTube может быть сложным, поэтому они создали калькулятор

API данных YouTube (v3) - калькулятор квот

Этот инструмент позволяет Вы оцениваете стоимость квоты для запроса API. Все запросы API, в том числе недействительные запросы, облагаются квотой как минимум в один балл.

Чтобы использовать инструмент, выберите соответствующий ресурс, метод и значения параметров детали для вашего запроса, и приблизительная стоимость квоты отобразится в таблице. Помните, что стоимость квот может изменяться без предупреждения, и приведенные здесь значения могут быть неточными.

blockquote>

Стоимость соответствует вашей квоте, найденной в консоли разработчика

enter image description here

Я не уверен, что понимаю, что вы под валютой API YouTube - это бесплатный API, который ничего не стоит использовать.

7
задан R S 25 April 2009 в 11:04
поделиться

8 ответов

Вот альтернативное решение:

#include <vector>                  
static std::vector<int> myVector(4,100);

bool init()
{
    myVector[0] = 42;      
    return true;
}

bool initresult = init();

int main()                  
{
    ;
}
6
ответ дан 6 December 2019 в 04:45
поделиться

Или просто создайте функцию и вызовите ее:

std::vector<int> init()
{
  ...
}

static std::vector<int> myvec = init()

Возможно, немного неэффективно, но это может не иметь значения для вас сейчас, и с C ++ 0x и перемещением это будет очень быстро.

Если вы хотите избежать копирования (для C ++ 03 и более ранних версий), используйте умный указатель:

std::vector<int>* init() { 
    return new std::vector<int>(42);
}

static boost::scoped_ptr<std::vector<int>> myvec(init());
10
ответ дан 6 December 2019 в 04:45
поделиться

Попробуйте это:

static int init[] = { 1, 2, 3 };
static vector<int> vi(init, init + sizeof init / sizeof init[ 0 ]);

Также см. std :: generate (если вы хотите инициализировать внутри функции).

20
ответ дан 6 December 2019 в 04:45
поделиться

C ++ 0x разрешит списки инициализаторов для стандартных контейнеров, точно так же как агрегаты:

std::vector<int> bottles_of_beer_on_the_wall = {100, 99, 98, 97};

Очевидно, еще не стандарт, но он предположительно поддерживается из GCC 4.4. Я не могу найти документацию для этого в MSVC, но Херб Саттер говорит, что их поддержка c ++ 0x впереди комитета ...

9
ответ дан 6 December 2019 в 04:45
поделиться

Вы можете использовать Boost, разделенный запятыми список .

8
ответ дан 6 December 2019 в 04:45
поделиться

Немного хакерски, но вы можете сделать это:

struct MyInitializer {
   MyInitializer() {
       myVector[0]=100;
       //...
   }
} myInitializer;  // This object gets constructed before main()
7
ответ дан 6 December 2019 в 04:45
поделиться

Вместо того, чтобы использовать глобальный, я бы посоветовал лучше использовать локальную статическую. Поскольку инициализация вашего вектора происходит до того, как будет введено main, любые сгенерированные исключения не будут перехвачены main. Например, у вас есть тип, который при его создании может вызвать исключение:

class A {
public:
  A() { 
    // ... code that might throw an exception
  }
};

Для следующей инициализации try / catch в теле main не будет перехватывать исключение, выданное конструктором, и поэтому ваша программа просто умрет немедленно, и вы, вероятно, даже не сможете использовать отладчик, чтобы найти причину!

std::Vector<A> v(5, A());  // May throw an exception here not caught by main

int main () {
  try {
     // Exception for 'v' not handled here.
  }
  catch (...) {
  }
}

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

std::Vector<A> init ();  // Returns a vector appropriately initialized

std::vector<A> & getV () {
  static std::vector<A> cache = init();
  return cache;
}

int main () {
  try {
     getV().at[0];    // First call to getV - so initialization occurs here!
  }
  catch (...) {
  }
}
3
ответ дан 6 December 2019 в 04:45
поделиться

Обернуть его по классу:

class SpecialVector
{
  public:
    SpecialVector()
    {
      myVector[0] = 1;
      myVector[1] = 4;
      // etc.
    }
    const vector<int> & GetVector() const
    {
      return myVector;
    }
  private:
    vector<int> myVector;
 };
 static SpecialVector SpVec;

 int main() {
 }
0
ответ дан 6 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: