Каков самый простой способ преобразования массива в вектор?


каков самый простой способ преобразования массива в вектор?

void test(vector<int> _array)
{
  ...
}

int x[3]={1, 2, 3};
test(x); // Syntax error.

Я хочу преобразовать x из массива int в вектор самым простым способом.

4 71

4 ответа:

использовать vector конструктор, который принимает два итератора, обратите внимание, что указатели являются допустимыми итераторами и используют неявное преобразование из массивов в указатели:

int x[3] = {1, 2, 3};
std::vector<int> v(x, x + sizeof x / sizeof x[0]);
test(v);

или

test(std::vector<int>(x, x + sizeof x / sizeof x[0]));

здесь sizeof x / sizeof x[0] - это очевидно 3 в этом контексте; это общий способ получения количества элементов в массиве. Обратите внимание, что x + sizeof x / sizeof x[0] указывает на один элемент дальше последний элемент.

лично мне очень нравится подход C++2011, потому что он не требует от вас использования sizeof() и не запоминать настройку границ массива, если вы когда-либо меняли границы массива (и вы также можете определить соответствующую функцию в C++2003, если хотите):

#include <iterator>
#include <vector>
int x[] = { 1, 2, 3, 4, 5 };
std::vector<int> v(std::begin(x), std::end(x));

очевидно, что с C++2011 Вы можете использовать списки инициализаторов в любом случае:

std::vector<int> v({ 1, 2, 3, 4, 5 });

указатели могут использоваться как и любые другие итераторы:

int x[3] = {1, 2, 3};
std::vector<int> v(x, x + 3);
test(v)

вы задаете неправильный вопрос здесь-вместо того, чтобы заставлять все в вектор спросить, как вы можете конвертировать тест для работы с итераторами вместо конкретного контейнера. Вы также можете обеспечить перегрузку, чтобы сохранить совместимость (и обрабатывать другие контейнеры одновременно бесплатно):

void test(const std::vector<int>& in) {
  // Iterate over vector and do whatever
}

будет:

template <typename Iterator>
void test(Iterator begin, const Iterator end) {
    // Iterate over range and do whatever
}

template <typename Container>
void test(const Container& in) {
    test(std::begin(in), std::end(in));
}

что можно сделать:

int x[3]={1, 2, 3};
test(x); // Now correct

(Ideone demo)