Каков самый простой способ преобразования массива в вектор?
каков самый простой способ преобразования массива в вектор?
void test(vector<int> _array)
{
...
}
int x[3]={1, 2, 3};
test(x); // Syntax error.
Я хочу преобразовать x из массива int в вектор самым простым способом.
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