从C++ std :: vector中选择单个元素的最佳方法是什么? 我习惯C风格的数组,这是我第一次使用矢量。std :: vector中的单个元素[C++]
我在寻找类似:
std::vector<std::string> myvector;
astring = myvector[1];
bstring = myvector[3];
cstring = myvector[10];
等。
从C++ std :: vector中选择单个元素的最佳方法是什么? 我习惯C风格的数组,这是我第一次使用矢量。std :: vector中的单个元素[C++]
我在寻找类似:
std::vector<std::string> myvector;
astring = myvector[1];
bstring = myvector[3];
cstring = myvector[10];
等。
有几种方法来访问在std::vector
元素:
myVector[3]
- 访问第4个元素(0索引)。myVector.at(3)
- 使用边界检查访问第4个元素。如果索引不小于元素数量,则会引发异常。std::find(std::begin(myVector), std::end(myVector), 10)
。就我个人而言,我从来没有找到at()
的用法,因为我记录了我正在使用的索引。我很少从某个地方拿一个号码,并将其粘贴到[]
。
但要注意,访问一个指标不低于使用[]
元素的数量少未定义行为(如果vector
有4个元素,您访问它们0
,1
,2
和3
)。预计你会确定它是安全的。所以在你的例子中,这将是非法的,因为你不会先把任何东西放入vector
。
简单使用operator[]
与使用数组一样。如果你想边界检查使用at()
。
所以我写的代码是正确的? –
@ D.Porzio如果您在进行这些访问之前将至少11个元素插入到矢量中 –
@ D.Porzio *仅*如果矢量已填充至少11个元素。 –
这通常是你如何访问向量,他们被做成类似于使用索引操作符的数组。
然而,一旦你在声明矢量像你这样,不传递任何参数the constructor载体是空,这意味着任何索引会出界,你将有未定义行为。
如果要指定一个初始大小,你可以传递一个参数的构造器:
std::vector<std::string> myvector(11); // Creates a vector of 11 elements
如果你永远也不会改变向量的大小,如果大小是固定在编译的时候使用编译时间常数,那么你或许应该被起诉std::array
代替:
std::array<std::string, 11> myarray;
您可以访问(即选择某个元素)类似于C风格数组的std::vector
,即通过使用索引。与数组类似,当您访问某个不存在的元素时,在std::vector
的情况下也不会执行绑定检查。例如,您已将矢量v
中的10个元素插入,但使用v[200]
访问第200个元素 - 但可能导致未定义的行为,因此请小心。
你问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;
}
有三种通用的方式来访问一个向量的元素。
第一个类似于使用下标运算符[]访问数组的元素。
例如
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;
多少个元素你希望缺省构造的'的std ::矢量'有哪些?如果您没有阅读文档,请不要急于进入。 –
LogicStuff
抱歉没有提供更完整的示例。 这种情况下的向量当然是空的。在我写的代码中不是。 –