2012-08-30 29 views
5

Tôi mới đến C++ và tò mò nếu đây là cách ưa thích chèn vào một std :: vectorChèn vào một std :: vector tại một chỉ số thông qua toán tử gán

std::vector<Object_I_madeup> myVector; 

    void setAt(int x, Object_I_madeup o) 
     { 
      myVector[x] = o; 

     } // set the array location at x to be o. 

Tôi hỏi vì Tôi thấy rất nhiều điều về cách sử dụng push_back hoặc rất khó hiểu insert(). Cách này giống Java có hợp lệ không? Tôi muốn làm điều đó nhiều hơn ...

+2

Ý bạn là gì * chèn *? Bạn có nghĩa là * đặt * giá trị tại vị trí đó không? Hoặc bạn có nghĩa là * chèn * một yếu tố tại vị trí đó di dời phần còn lại của các yếu tố? Tôi thấy việc bạn sử dụng * chèn * gây nhầm lẫn ... –

Trả lời

10
myVector[x] = o; 

Chỉ được xác định rõ ràng nếu x < myVector.size(). Nếu không, nó gọi hành vi không xác định, bởi vì trong trường hợp đó nó cố gắng truy cập một phần tử ra khỏi giới hạn của vectơ.

Nếu bạn muốn chắc chắn rằng nó sẽ kiểm tra cho out-of-bound truy cập cũng có, sau đó sử dụng at() như:

myVector.at(x) = o; 

Bây giờ nó sẽ ném ngoại lệ nếu std::out_of_rangex >= myVector.size(). Vì vậy, bạn phải đặt mã này trong khối try-catch! Sự khác biệt giữa chúng được thảo luận chi tiết ở đây.

+0

API 'chèn' trên vectơ có làm cho việc kiểm tra truy cập không giới hạn này giống như' at' API không? 'insert' API trông độc đáo theo nghĩa là nó lấy một tham số vị trí vòng lặp thay cho tham số vị trí int. Tôi không biết liệu tôi có thể thực sự tạo một trình lặp hay không.r.t. một vị trí của một vectơ sẽ nằm ngoài giới hạn của nó. – RBT

1

Nó chỉ hợp lệ nếu kích thước của vectơ ít nhất là x + 1. Nếu không, bạn đang truy cập nó ngoài giới hạn.

Nếu bạn khai báo các vector như thế này:

std::vector<Object_I_madeup> myVector(10); // construct the vector with size 10 
              // and default-initialize its elements 

sau đó bạn có thể yên tâm truy cập vào các chỉ số 0 - 9. vector của bạn trong ví dụ này là trống rỗng, tuy nhiên, vẫn chưa có một chỉ số hợp lệ để nó .

+0

Nói cách khác, nó sẽ không thay đổi kích cỡ véc tơ cho bạn nếu chỉ mục không hợp lệ. –

1

Nó sẽ làm việc trong trường hợp bạn không cố gắng để truy cập nó ra khỏi giới hạn của nó, ví dụ: kích thước vector lớn hơn x.

1

Nếu bạn đang tìm kiếm một tương đương java giống như các phương pháp ArrayList.set(), bạn có thể làm điều đó chặt chẽ hơn thông qua

void setAt(int x, Object_I_madeup o) 
{ 
    myVector.at(x) = o; 
} 

Giống như phiên bản Java, vector::at() sẽ ném một ngoại lệ nếu vector không phải là đủ lớn. Lưu ý, điều này làm cho một bản sao của đối tượng (trên thực tế, hai, kể từ khi bạn cũng đi qua giá trị cho hàm).

2

myVector[x] = o thực hiện điều gì đó hoàn toàn khác với việc sử dụng myVector.push_back(o) (hoặc sử dụng insert). Vì vậy mà phương pháp là chính xác phụ thuộc vào những gì bạn đang cố gắng làm:

  • myVector[x] = o không chèn vào vector, nhưng thay thế các phần tử ở vị trí x với o. Do đó, độ dài của vector không thay đổi và giá trị trước đó ở vị trí x không còn ở trong số vector nữa. Nếu chiều dài myVector không lớn hơn thì x điều này sẽ dẫn đến truy cập ngoài giới hạn, dẫn đến hành vi không xác định
  • myVector.push_back(o) sẽ chèn o vào cuối myVector.Do đó, sau khi hoạt động này, chiều dài của vector sẽ được tăng lên một và phần tử cuối cùng của myVector sẽ là o. Không có giá trị nào bị xóa khỏi myVector.
  • myVector.insert(i, o) sẽ chèn o ở vị trí tùy ý, được chỉ định bởi trình lặp số i. Do đó, chiều dài của vectơ sẽ được tăng lên một và phần tử "ith" (số phần tử myVector.begin() - i) sẽ là o
Các vấn đề liên quan