2015-12-30 69 views
-3

从C++ std :: vector中选择单个元素的最佳方法是什么? 我习惯C风格的数组,这是我第一次使用矢量。std :: vector中的单个元素[C++]

我在寻找类似:

std::vector<std::string> myvector; 

astring = myvector[1]; 
bstring = myvector[3]; 
cstring = myvector[10]; 

等。

+1

多少个元素你希望缺省构造的'的std ::矢量'有哪些?如果您没有阅读文档,请不要急于进入。 – LogicStuff

+0

抱歉没有提供更完整的示例。 这种情况下的向量当然是空的。在我写的代码中不是。 –

回答

3

有几种方法来访问在std::vector元素:

就我个人而言,我从来没有找到at()的用法,因为我记录了我正在使用的索引。我很少从某个地方拿一个号码,并将其粘贴到[]

但要注意,访问一个指标不低于使用[]元素的数量少未定义行为(如果vector有4个元素,您访问它们0123)。预计你会确定它是安全的。所以在你的例子中,这将是非法的,因为你不会先把任何东西放入vector

0

简单使用operator[]与使用数组一样。如果你想边界检查使用at()

+0

所以我写的代码是正确的? –

+0

@ D.Porzio如果您在进行这些访问之前将至少11个元素插入到矢量中 –

+0

@ D.Porzio *仅*如果矢量已填充至少11个元素。 –

0

这通常是你如何访问向量,他们被做成类似于使用索引操作符的数组。

然而,一旦你在声明矢量像你这样,不传递任何参数the constructor载体是,这意味着任何索引会出界,你将有未定义行为

如果要指定一个初始大小,你可以传递一个参数的构造器:

std::vector<std::string> myvector(11); // Creates a vector of 11 elements 

如果你永远也不会改变向量的大小,如果大小是固定在编译的时候使用编译时间常数,那么你或许应该被起诉std::array代替:

std::array<std::string, 11> myarray; 
0

您可以访问(即选择某个元素)类似于C风格数组的std::vector,即通过使用索引。与数组类似,当您访问某个不存在的元素时,在std::vector的情况下也不会执行绑定检查。例如,您已将矢量v中的10个元素插入,但使用v[200]访问第200个元素 - 但可能导致未定义的行为,因此请小心。

2

你问best way ......答案是:没有一般best way

best way并不总是相同的。这真的取决于你的代码在做什么。

best way也取决于你想达到什么,例如,最佳性能,最佳代码可维护性,最佳代码可读性等。

best way也基于个人观点。

所以只是重复了答案:没有一般best way

其他的答案中提到了许多不同的posibilities的。我会再添加一个。

// To iterate over all elements in a vector you can do 
for (auto& e : someVector) 
{ 
    // Do something with e, e.g. print it 
    cout << e; 
} 
2

有三种通用的方式来访问一个向量的元素。

第一个类似于使用下标运算符[]访问数组的元素。

例如

std::vector<std::string> v = { "Hello", "World" }; 

std::cout << v[0] << ' ' << v[1] << std::endl; 

第二个是使用类似于使用指针迭代器。例如

std::vector<std::string> v = { "Hello", "World" }; 

auto it = v.begin(); 

std::cout << *it << ' ' << *(it + 1) << std::endl; 

第三个是使用成员函数at,检查向量的边界,并抛出当试图访问内存超出矢量

std::vector<std::string> v = { "Hello", "World" }; 

std::cout << v.at(0) << ' ' << v.at(1) << std::endl; 

还有一些例外方法接取第一和例如一个矢量

的最后元件

std::vector<std::string> v = { "Hello", "World" }; 

std::cout << v.front() << ' ' << v.back() << std::endl; 

要顺序访问矢量的所有元素,可以使用三种循环。

例如

std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

for (int x : v) std::cout << x << ' '; 
std::cout << std::endl; 

std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

for (std::vector<int>::size_type i = 0; i < v.size(); i++) std::cout << v[i] << ' '; 
std::cout << std::endl; 

std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

for (auto it = v.begin(); it != v.end(); ++it) std::cout << *it << ' '; 
std::cout << std::endl; 
相关问题