Hỏi về biến kiểu auto trong C++ 11

vậy là ko phải gán exists = true mà gán pointer = &ip à? :V

nếu vậy thì đúng là bị lỗi đó rồi, thoát khỏi vòng lặp ip bị thu hồi nên pointer trỏ vào vùng nhớ đã bị thu hồi, lúc chạy được lúc chạy ko được đúng triệu chứng rồi :V

vector thì đừng nên reference kiểu pointer như vậy, lỡ có push_back ips nó thay đổi capacity, nó copy mảng cũ sang mảng mới bự hơn thì mấy cái pointer tới phần tử cũ cũng trỏ vào vùng nhớ đã bị thu hồi, cũng chạy sai như vậy :V Xài 1 cái size_t p lưu index của phần tử đó rồi gọi ips[p] thì chắc ăn hơn :V

thứ nhất là thêm & vào: auto&
thứ hai là xài size_t thay cho pointer, lấy index của ip trong ips bằng cách này: std::distance(&ips[0], &ip)

cái đó là cách chữa cháy, còn cách khác xài thư viện <algorithm> thì thế này:

auto it = std::find(begin(ips), end(ips), input);
size_t index = -1;
if (it != end(ips))
    index = std::distance(begin(ips), it);
else
    //ko tìm thấy

hoặc xài thẳng it như con trỏ: *it luôn ko cần gán cái index làm gì, nếu sau đó ko có push_back gì vào ips nữa :V

có cách Pythonista nữa: http://reedbeta.com/blog/python-like-enumerate-in-cpp17/ thì viết thế này:

for (auto [i, ip] : enumerate(ips))
{
    // i là index, ip là ips[i] 
}

ko cần auto& ở đây luôn :V :V :V :V

C++17 phong cách Python :V :V :V
http://coliru.stacked-crooked.com/a/ec5a5b8c34fc9eea

#include <tuple>
#include <vector>
#include <string>
#include <iostream>

template <typename T,
          typename TIter = decltype(std::begin(std::declval<T>())),
          typename = decltype(std::end(std::declval<T>()))>
constexpr auto enumerate(T&& iterable)
{
    struct iterator {
        size_t i;
        TIter iter;
        bool operator!=(const iterator& other) const { return iter != other.iter; }
        void operator++() { ++i; ++iter; }
        auto operator*() const { return std::tie(i, *iter); }
    };
    struct iterable_wrapper {
        T iterable;
        auto begin() { return iterator{ 0, std::begin(iterable) }; }
        auto end() { return iterator{ 0, std::end(iterable) }; }
    };
    return iterable_wrapper{ std::forward<T>(iterable) };
}

int main()
{
    std::wstring input = L"172.26.3.3";

    std::vector<std::wstring> ips = {
        L"172.26.3.1",
        L"172.26.3.3",
        L"172.26.3.3",
    };
    
    size_t index = -1;
    for (auto [i, ip] : enumerate(ips))
    {
        if (ip == input)
        {
            index = i;
            break;
        }
    }
    std::cout << index;
}