std :: vector中的各个元素[C ++]

时间:2015-12-30 10:47:31

标签: c++ vector

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

我正在寻找类似的东西:

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

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

等等。

6 个答案:

答案 0 :(得分:3)

有几种方法可以访问std::vector中的元素:

我个人从来没有找到at()的用途,因为我跟踪了我正在使用的索引。我很少从某个地方拿一个数字并将其粘贴到[]

但请注意,使用[]访问不少于元素数量的索引是未定义行为(如果vector有4个元素,则可以使用{{ {1}},012)。您应该确定自己是安全的。因此,在您的示例中,这将是非法的,因为您不会先将任何内容放入3

答案 1 :(得分:2)

您要求best way ...答案是:没有一般best way

best way并不总是一样的。这实际上取决于你的代码在做什么。

best way还取决于您想要达到的目标,例如最佳性能,最佳代码可维护性,最佳代码可读性等。

best way也基于个人观点。

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

其他答案提到了许多不同的可能性。我还要再添一个。

// 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 :(得分: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;

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这通常是您访问向量的方式,它们与使用索引运算符的数组类似。

但是,一旦你像你一样声明了一个向量,而没有向the constructor传递任何参数,那么向量是为空,这意味着任何索引都将超出界限而你将有未定义的行为

如果要指定初始大小,可以将参数传递给构造函数:

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

如果你永远不会改变向量的大小,如果使用编译时常量在编译时修复了大小,那么你应该起诉std::array而不是:

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

答案 5 :(得分:0)

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