从C ++ std :: vector中选择单个元素的最佳方法是什么? 我习惯了C风格的数组,这是我第一次使用矢量。
我正在寻找类似的东西:
std::vector<std::string> myvector;
astring = myvector[1];
bstring = myvector[3];
cstring = myvector[10];
等等。
答案 0 :(得分:3)
有几种方法可以访问std::vector
中的元素:
myVector[3]
- 访问第4个元素(0-indexed)。myVector.at(3)
- 使用边界检查访问第4个元素。如果索引不小于元素数,则抛出异常。std::find(std::begin(myVector), std::end(myVector), 10)
。我个人从来没有找到at()
的用途,因为我跟踪了我正在使用的索引。我很少从某个地方拿一个数字并将其粘贴到[]
。
但请注意,使用[]
访问不少于元素数量的索引是未定义行为(如果vector
有4个元素,则可以使用{{ {1}},0
,1
和2
)。您应该确定自己是安全的。因此,在您的示例中,这将是非法的,因为您不会先将任何内容放入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个元素 - 但它可能导致未定义的行为,因此请小心。